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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Mr.Yan 中级黑马   /  2015-11-20 23:44  /  1395 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

int main(){
    int arr[3][3] = {1,2,3,4,5,6,7,8,9 };
    int (*p)[3] = arr;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d -- %p\n",*(*(p+i)+j),*(p+i)+j);       //*(*(p+i)+j)  -->  *(*(arr+i)+j)  -->   *(arr+j)  -->  arr[j]   (这边注释部分,表示头都晕了,求大牛指教下)
        }
    }
return 0;
}
上面注释部分搞不懂,求解释,拜托!

10 个回复

倒序浏览
二位数组指针是一个指针。当它指向一个二维数组的首地址,它的使用与二维数组名是完全一样的。它是一个二级指针,运算的方式按照所指向的数组的每个元素数组的长度来计算。它的定义跟指针数组是不一样的
回复 使用道具 举报
你是深圳基础1期的?

这一块我的理解是这样的

p 即 arr 也即 &arr[0]

p+i 就是arr+i 也即&arr[0]+i 也即&arr[i]

那么*(p+i) 也就是 *(&arr[i]) 也就是arr[i] 也就是&arr[i][0]

那么*(p+i)+j 就是&arr[i][0]+j 也即 &arr[i][j]

那么*(*(p+i)+j ) 就是 *( &arr[i][j]) 也即 arr[i][j]
回复 使用道具 举报 1 0
arr表示的是数组的首元素的地址, 这个二维数组, 这里的p+i,就表示第一个元素移动了i步,然后(p+i)+j表示p移动i步之后再移动j步,然后这个时候取此时指针指向的空间的值,也就是%d,     后面的*(p+i)+j,  这里是先p移动i步取值之后,再加上当前j的值,然后取这个时候的值的地址%p   
回复 使用道具 举报
先看定义的时候,arr是一个二位数组,arr里存的是这个数组的首地址,p是个二维数组的指针,把arr的值赋给它,就是把上面二位数组的首地址给它了,现在arr和p都存的是二位数组的首地址。打印的时候看有几个*,1个*表示只解开了一个维度,必定还是个地址,2个*表示解开了2个维度,到达值这层了。在此基础上来看具体的。
*(*(p+i)+j)  -->  *(*(arr+i)+j)  -->   *(arr+j)  -->  arr[j]
这4个不是全相等的,前2个等价,后2个等价。p=arr,所以*(*(p+i)+j)  ==  *(*(arr+i)+j)这个好理解吧。
arr==&arr[0]==&arr[0][0];这个你要不懂,自己画个存二位数组的表格看看,画完 *(arr+j)== arr[j] 这个应该也能懂了。
我记得第一次学数组和指针的时候就很好理解啊,不过那时候老师没给我们绕,黑马视频里讲的太绕了,其实不难的。
回复 使用道具 举报
这个应该是地址偏移吧
回复 使用道具 举报
Mr.Yan 中级黑马 2015-11-21 23:51:07
7#
Breezearrow 发表于 2015-11-21 00:03
你是深圳基础1期的?

这一块我的理解是这样的

苏?
好像理解了,再捋一捋.
回复 使用道具 举报
这样解释你还不理解,你真的不适合编程。大牛解释,,清晰啊
回复 使用道具 举报
cube川 中级黑马 2015-11-22 13:06:27
9#
指针指向的问题  画个图一层一层往上推导
回复 使用道具 举报
分享了牛人的解释
回复 使用道具 举报
学习了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马