A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

用指针来遍历一个二维数,代码如下:
  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语言,在指针、指针数组、指针与二维数组这里比较容易迷惑,多多总结!希望能帮助在这里迷惑的人。

3 个回复

正序浏览
如果搞清楚二维数组内存结构就不难理解了
回复 使用道具 举报
是首元素没有问题,问题是你对”首元素“的理解有偏差。int a[3][2]其实可以看作一个复杂声明:a[3]表明a是一个数组,[2]表明a的元素是2个数组,int表明a的元素是2个int类型数组。所以*a确实代表a的首元素,只不过这个元素是数组而不是简单的数值。
回复 使用道具 举报
我也正看到这里   好东西,:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马