黑马程序员技术交流社区

标题: 二维数组疑问 [打印本页]

作者: 瑜尚    时间: 2016-7-19 18:17
标题: 二维数组疑问
#include <stdio.h>

int main(int argc, const char * argv[]) {

   
    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
   
    printf("a=%p\n",a);
    printf("&a[0]=%p\n",&a);
    printf("a+1=%p\n",a+1);
    printf("&a[1]=%p\n",&a[1]);
    printf("a[0]+1=%p\n",a[0]+1);
    printf("*a+1=%p\n",*a+1);
    printf("*(a[0]+1)=%d\n",*(a[0]+1));
    printf("*(*(a)+1=%d\n",*(*(a)+1));
   
   
   
    return 0;
}
代码如上,请大神注释一下每行的意思,看不懂
作者: 李江波    时间: 2016-7-20 15:33
printf("a=%p\n",a);//数组首地址     printf("&a[0]=%p\n",&a);//数组首地址     printf("a+1=%p\n",a+1);  //第2行首地址    printf("&a[1]=%p\n",&a[1]);    //  第2行指针    printf("a[0]+1=%p\n",a[0]+1);   //第2列指针    printf("*a+1=%p\n",*a+1);   //  a数组的地址加了一个4*4=16字节     printf("*(a[0]+1)=%d\n",*(a[0]+1));   //第2列的第一个    printf("*(*(a)+1=%d\n",*(*(a)+1));    //输出的应该是2
作者: 18222929637    时间: 2016-7-20 19:56
看了上面的回复,我觉得有没说清的地方。二维数组中第一行的首地址就是数组的地址,也是数组第一个元素的地址,也是数组名取地址后的地址。其他的大概都是一些指针的加减,那个不是很复杂。你可以把二维数组当成一个同类型的以为指针数组去理解,会好很多。
作者: 18222929637    时间: 2016-7-20 20:03
其实也没必要太过于担心这个弄得不是很清楚,如果能懂下面的代码,应该就没什么问题了。
char arr[3][4]={"abc","def","ghi"};等价于char *arr[3]={"abc","def","ghi"};
二维数组每一行的首地址就是一维指针数组每个元素的值。
作者: 瑜尚    时间: 2016-7-20 21:17
18222929637 发表于 2016-7-20 20:03
其实也没必要太过于担心这个弄得不是很清楚,如果能懂下面的代码,应该就没什么问题了。
char arr[3][4]={" ...

感谢回复解答,通过你的指点理解了




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