一维数组
数组名表示的是首元素的地址
但有两个例外:
- sizeof(数组名), 这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
- &数组名,这里的数组名表示的是整个数组的地址。
int arr[3] = {1, 2, 3};
printf("%p\n", arr); //数组名就是首元素的地址
printf("%p\n", arr+1);
printf("-----------------------\n");
printf("%p\n", &arr[0]); //首元素的地址
printf("%p\n", &arr[0]+1);
printf("-----------------------\n");
printf("%p\n", &arr); //数组的地址
printf("%p\n", &arr+1);
上述代码的结果如下:
00AFFC10
00AFFC14
-----------------------
00AFFC10
00AFFC14
-----------------------
00AFFC10
00AFFC1C
二维数组
二维数组名表示的也是首元素的地址,但是二维数组的首元素是第一行
int arr[2][3] = { 1, 2, 3, 2, 3, 4};
printf("%p\n", arr); //首元素的地址,即第一行的地址
printf("%p\n", arr+1);
printf("------------------\n");
printf("%p\n", &arr[0]); //首元素的地址,即第一行的地址
printf("%p\n", &arr[0] + 1);
printf("------------------\n");
printf("%p\n", &arr);
printf("%p\n", &arr + 1);
其结果如下:
0039FBF4
0039FC00
------------------
0039FBF4
0039FC00
------------------
0039FBF4
0039FC0C
总结:
一维数组:int arr1[2] = {0};
二维数组:int arr2[2][3] = {1, 2, 3, 2, 3, 4};
一维数组中的&arr1 ,是整个数组的地址,即一维数组的地址;
二维数组中的arr2, 是第一行的地址,而第一行相当于是一个一维数组,所以arr2也就是一维数组的地址,和&arr1是相似的。