C语言多维数组与指针的关系
int arr[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,8}};
printf("int arr[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,8}}\n");
puts("");
printf("arr : %p\n",arr);
printf("*arr : %p\n",*arr);
printf("arr[0] : %p\n",arr[0]);
printf("*arr[0] : %d\n",*arr[0]);
printf("arr[0][0] : %d\n",arr[0][0]);
printf("&arr[0][0] : %p\n",&arr[0][0]);
运行结果
- 由此看出,数组名arr是一个二级指针,arr[0]是一个一级指针;
int arr[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,8}};
printf("int arr[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,8}}\n");
puts("");
printf("arr : %p\n",arr);
printf("*arr+1 : %p\n",*arr+1);
printf("*(arr+1) : %p\n",*(arr+1));
- 由此看出,*arr+1指针的变化是由一个int的大小进行移动的;
- 而*(arr+1)指针的变化是由四个int的大小进行移动的;
- 所以*arr和arr分别代表行指针和列指针;
int arr[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,8}};
printf("int arr[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,8}}\n");
puts("");
printf("arr : %p\n",arr);
printf("arr+1 : %p\n",arr+1);
printf("arr+2 : %p\n",arr+2);
printf("&arr[2][3] : %p\n",&arr[2][3]);
printf("arr[2][3] : %d\n",arr[2][3]);
printf("&arr+1 : %p\n",&arr+1);
- 由此可以看出&arr代表的是整个数组的首地址,地址名加一后,直接跳出整个数组。