C语言用二级指针遍历静态二维数组

通常进行二维数组遍历都会想到用二级指针,今天试了一下竟然会报错。
代码如下:

#include #include void traversalArray(int **a,int row,int column) { for(int i = 0; i

C语言用二级指针遍历静态二维数组
文章图片

出现这个错误我们来进行分析一下。
首先我们先来做一个例子:
【C语言用二级指针遍历静态二维数组】int x = 100;
int *y = &x;
int **z = (int **)y;
printf("%d\n",*z); //100
printf("%d\n",**z); //报错
C语言用二级指针遍历静态二维数组
文章图片

通过上面的例子是不是觉得和用二级指针遍历二维数组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

C语言用二级指针遍历静态二维数组
文章图片

成功的将二维数组遍历了。

    推荐阅读