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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© atlas 中级黑马   /  2014-10-15 16:53  /  2498 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

例:int a[2][3] = {{1,3,5},{2,4,6}}
怎么理解 *(a+i)+j?
  1. main()
  2. {
  3.   int a[3][3]={1,2,3,4,5,6,7,8,9};
  4.   int *p,i,j;
  5.   p = a;
  6.   for(i=0;i<3;i++)
  7.   {
  8.     for(j=0;j<3;j++)
  9.       {
  10.         printf("%d",*(*(a+i)+j));
  11.       }  
  12.   }
  13. }
复制代码

你又知道这个结果为什么吗?

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

5 个回复

倒序浏览
a[3][3]={1,2,3,4,5,6,7,8,9}  这个数组你可以这样看a[3][3]={{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
这个二维数组可以拆分为四个一维数组a[3] = {b1, b2, b3}; 和b1[3] = {1, 2, 3};  b2][3] =  {4, 5, 6};  b3[3] = {7, 8, 9};
*(*(a+i)+j) :
*(a+i)就相当于在一维数组a中找第i个数组元素; *(a+0) == b1 ,  *(a+1) == b2,  *(a+2) == b3
*(*(a+0)+j) == *(b1+j) , *(*(a+1)+j) == *(b2+j), *(*(a+2)+j) == *(b3+j)

*(b1+j) 又相当于在b1这个一维数组中找出下标为j的数组元素*(b1+0) == 1 ,  *(b1+1) == 2,  *(b1+2) == 3
其他两个*(b2+j) , *(b3+j)类推。

所以*(*(a+i)+j) 就可以找出二维数组下标分别为i和j的数组元素了。

你上边代码应该是遍历二维数组,按顺序输出二维数组的每个元素吧。
你的这个方法挺好的,用指针来输出二维数组的元素,一般人都直接用数组a[i][j]的形式。。:P:P
回复 使用道具 举报
a[i][j]是一个二维数组 i,j分别看做行和列*(a+i)表示第i行的首地址  *(a+i)+j表示第i行第j列的地址
*(*(a+i)+j)就是表示第i行第j列的数  

你参考一下吧 希望能帮到你
回复 使用道具 举报
thank you for everyone!
回复 使用道具 举报
int a[3][3]={1,2,3,4,5,6,7,8,9};
感觉二维数组这样写是不对的。
回复 使用道具 举报
二楼正解。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马