下面所述的方法只能适用于方便大家可以更好的理解二维数组使用时所遇到的理解性方面的困难。
其中的实质可能不符!!
我们会遇到下面的情形:
给出一个二维数组:
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
请在屏幕上打出该数组。
在我们刚开始学习的时候,用的方法应该都是两个for循环来进行操作:
int main() { int a[3][5] = { {1,2,3,4,5} ,{2,3,4,5,6},{3,4,5,6,7} }; int i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 5; j++) { printf("%d ", a[i][j]); } printf("\n"); } return 0; }
运行的结果为
那么,如果用指针的方法如何实现操作?
首先,我用自己的理解画了一幅图:
这里我们先不探讨地址1和a【0】【0】的大小关系,因为我们知道在一维数组中
我们建立一个一维数组:
int a[10]={0}:
其中的a就代码首元素的地址。所以这一块理解很别扭。
观察下列代码:
int main()
{
int a[10] = { 0 };
printf("%p \n", &a);
printf("%p ", a);
return 0;
}
其中的运算结果是一样的。
我们知道如果打印一维数组的一个数,应该用:
printf("%d ", a[i]);
这种形式。
其中的a[i]我们可以把它换成*(a+i);
这种写法不知道大家能不能理解。
*是取值操作符,作用是取出得到对应地址中的那个数或者字符。
a是第一个首元素的地址。a+i(i从0开始)相应的地址往后移动i个。
然后进行取值操作:*(a+i)就得到相应的内容。
把它运用到二维数组里面去。结合上面的画的图。
a是a[0]的地址,而a[0]又是a[0][0] ,a[0][1].....a[0][5]数组的首地址
所以,如果我们要想得到二维数组中的第i行第j列元素,
我们需要首先找到行 a+i (a是第一行的地址,+i之后相应的往后走几个数列,到第几行)
还有进行取值操作 : *(a+i)---------此时得到的是第i行那一行元素的首元素地址!!!
在进行取值操作 : **(a+i)---------对第i行首元素地址进行解引用,得到的是第i行第一个元素的大小!!!
在*(a+i)的基础上在加上j:*(a+i)+j-----------相应i行的地址往后移动j个 ,找到i行j列个元素!!!
最后在进行取值操作:*(*(a+i)+j)--------就得到相应的i行j列个元素啦!!!
折回来,用 [ ] 操作符应该如何书写?
a是数组的数组的首元素地址 ( a[0] )
a[i]是第i行的地址;
a[i]+j,地址相应的往后移动j个
再进行取值操作:*(a[i]+j)。
此过程只是适用于大家容易理解代码,因为我觉得过程的实质有些问题,如有问题,欢迎大家指出,一起进步!!!