黑马程序员技术交流社区

标题: 刚理解关于C语言指针和二维数组的一个问题 [打印本页]

作者: longshaocn    时间: 2014-9-14 10:49
标题: 刚理解关于C语言指针和二维数组的一个问题
用指针来遍历一个二维数,代码如下:
  1. int a[3][3]={5,2,2,9,5,6,2,1,9};
  2.     for (int i=0; i<3; i++) {
  3.         for (int j=0; j<3; j++) {
  4.             printf("%d ",*(*(p+i)+j));
  5.         }
  6.     }
复制代码

其实很简单,两个for循环,用指针分别取元素就行了,但是迷惑到了一个地方,就是*(p+i),一直以为*(p+i)取出的是每行的首个元素,但是不是这样的,*(p+i)其实取得是每行的地址,因为a[0],a[1]等表示的是这行的内存地址,迷惑就在这里了。。。  所以最后取每个元素就是在*(p+i)基础上再进行指针的偏移,即*(*(p+i)+j)。
刚学C语言,在指针、指针数组、指针与二维数组这里比较容易迷惑,多多总结!希望能帮助在这里迷惑的人。
作者: 七年级生    时间: 2014-9-14 11:29
我也正看到这里   好东西,:)
作者: fantacyleo    时间: 2014-9-14 16:05
是首元素没有问题,问题是你对”首元素“的理解有偏差。int a[3][2]其实可以看作一个复杂声明:a[3]表明a是一个数组,[2]表明a的元素是2个数组,int表明a的元素是2个int类型数组。所以*a确实代表a的首元素,只不过这个元素是数组而不是简单的数值。
作者: 明天过后1    时间: 2014-9-14 16:08
如果搞清楚二维数组内存结构就不难理解了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2