黑马程序员技术交流社区

标题: 二维数组指针 [打印本页]

作者: Mr.Yan    时间: 2015-11-20 23:44
标题: 二维数组指针
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;
}
上面注释部分搞不懂,求解释,拜托!

作者: Tmac90301    时间: 2015-11-20 23:53
二位数组指针是一个指针。当它指向一个二维数组的首地址,它的使用与二维数组名是完全一样的。它是一个二级指针,运算的方式按照所指向的数组的每个元素数组的长度来计算。它的定义跟指针数组是不一样的
作者: Breezearrow    时间: 2015-11-21 00:03
你是深圳基础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]
作者: 熊德玺    时间: 2015-11-21 00:07
arr表示的是数组的首元素的地址, 这个二维数组, 这里的p+i,就表示第一个元素移动了i步,然后(p+i)+j表示p移动i步之后再移动j步,然后这个时候取此时指针指向的空间的值,也就是%d,     后面的*(p+i)+j,  这里是先p移动i步取值之后,再加上当前j的值,然后取这个时候的值的地址%p   
作者: 打滚的橘子    时间: 2015-11-21 05:06
先看定义的时候,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] 这个应该也能懂了。
我记得第一次学数组和指针的时候就很好理解啊,不过那时候老师没给我们绕,黑马视频里讲的太绕了,其实不难的。
作者: zhecipinle    时间: 2015-11-21 20:38
这个应该是地址偏移吧
作者: Mr.Yan    时间: 2015-11-21 23:51
Breezearrow 发表于 2015-11-21 00:03
你是深圳基础1期的?

这一块我的理解是这样的

苏?
好像理解了,再捋一捋.
作者: IPswhatb“is”    时间: 2015-11-22 00:57
这样解释你还不理解,你真的不适合编程。大牛解释,,清晰啊
作者: cube川    时间: 2015-11-22 13:06
指针指向的问题  画个图一层一层往上推导
作者: 陈光慧    时间: 2015-11-25 22:20
分享了牛人的解释
作者: qinxiaodong    时间: 2015-11-26 16:25
学习了!




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