C语言用二级指针遍历静态二维数组
通常进行二维数组遍历都会想到用二级指针,今天试了一下竟然会报错。
代码如下:
#include
#include void traversalArray(int **a,int row,int column)
{
for(int i = 0;
i|
文章图片
出现这个错误我们来进行分析一下。
首先我们先来做一个例子:
【C语言用二级指针遍历静态二维数组】int x = 100;
int *y = &x;
int **z = (int **)y;
printf("%d\n",*z); //100
printf("%d\n",**z); //报错
文章图片
通过上面的例子是不是觉得和用二级指针遍历二维数组b一样的错误。
a == b == *b == &b[0][0] 这个是成立的对吧。
既然a == &b[0][0]了,那*a == 0了(就是二维数组b的第一行第一列的元素),那么再对0取*就是**a了,是不是就出现访问到了操作系统的内存区域了,发生冲突,Windows就直接把你干掉了。是不是和上面的**z一样的道理。
我们再来分析一下二维数组b的类型,int b[3][4]的类型为int (*)[4]的数组指针,表示一个指针指向每行有4个sizeof(int)个字节,每次移动sizeof(int)字节,更重要的一点是,它的内存地址是连续的。
那从上述分析来看是不是觉得二维数组其实就是一个一维数组的加强版本。既然是这样那我们就把int **a强制转换成int *a,然后再每次移动sizeof(int)个字节大小去遍历。
那我们再来修改一个traversalArray这个函数。
#include
#include
void traversalArray(int **a,int row,int column)
{
for(int i = 0;
i|
文章图片
成功的将二维数组遍历了。
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 涉毒患者(新诗)
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。