#include <stdio.h>
int main() {
int zippo[4][2] = { { 2, 4 }, { 6, 8 }, { 1, 3 }, { 5, 7 } };
// zippo 二维数组的首元素地址(即zippo[0]的地址,类型为int (*)[2])
printf("zippo = %p\n", zippo);
// zippo+1 指向二维数组第二个元素的地址(即zippo[1]的地址,类型为int (*)[2])
printf("zippo + 1 = %p\n", zippo + 1);
// zippo[0] 二维数组第一个元素的地址(即第一个一维数组的地址,类型为int*)
printf("zippo[0] = %p\n ", zippo[0]);
// *zippo[0] 二维数组第一个元素中第一个元素的值:2
printf("*zippo[0] = %d\n ", *zippo[0]);
// zippo[0] + 1 二维数组第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址)
printf("zippo[0] + 1 = %p\n", zippo[0] + 1);
// *(zippo[0] + 1) 二维数组第一个元素中第二个元素的值:4
printf("*(zippo[0] + 1) = %d\n", *(zippo[0] + 1));
// *zippo 二维数组第一个元素的地址(即第一个一维数组的地址,类型为int*)
printf("*zippo = %p\n", *zippo);
// **zippo 二维数组第一个元素中第一个元素的值:2
printf("**zippo = %d\n", **zippo);
// *zippo + 1 二维数组第一个元素(即第一个一维数组)中第二个元素的地址
printf("*zippo+1 = %p\n", *zippo+1);
// *(*zippo + 1) 二维数组第一个元素(即第一个一维数组)中第二个元素的值:4
printf("*(*zippo + 1) = %d\n", *(*zippo + 1));
// zippo[0][0] 二维数组第一个元素(即第一个一维数组)中第一个元素的值:2
printf("zippo[0][0] = %d\n", zippo[0][0]);
// *zippo[1] 二维数组第二个元素(即第二个一维数组)中第一个元素的值:6
printf("*zippo[1] = %d\n", *zippo[1]);
// *(*zippo+1) 二维数组第一个元素(即第一个一维数组)中第二个元素的值:4
printf("*(*zippo+1) = %d\n", *(*zippo+1));
// *(zippo[0]+1) 二维数组第一个元素(即第一个一维数组)中第二个元素的值:4
printf("*(zippo[0]+1) = %d\n", *(zippo[0]+1));
// *(*(zippo+2) + 1) 二维数组第三个元素(即第三个一维数组)中第二个元素的值:3
printf("*(*(zippo+2) + 1) = %d\n", *(*(zippo + 2) + 1));
// 声明一个指向内含两个int类型元素的一维数组的指针
int(*pz)[2];
// pz 指向 zippo 第一个元素的地址(即第一个一维数组的地址)
pz = zippo;
// pz 的值(即 zippo 的值):二维数组的首地址
printf("pz = %p\n", pz);
// pz[0] 二维数组第一个元素的地址(即第一个一维数组的地址)
printf("pz[0] = %p\n", pz[0]);
// *pz[0] 二维数组第一个元素中第一个元素的值:2
printf("*pz[0] = %d\n", *pz[0]);
// pz[0] + 1 二维数组第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址)
printf("pz[0]+1 = %p\n", pz[0]+1);
// *(pz[0] + 1) 二维数组第一个元素中第二个元素的值:4
printf("*(pz[0]+1) = %d\n", *(pz[0]+1));
// *pz 二维数组第一个元素的地址(即第一个一维数组的地址)
printf("*pz = %p\n", *pz);
// **pz 二维数组第一个元素中第一个元素的值:2
printf("**pz = %d\n", **pz);
// **pz + 1 第一个元素的值加一:3
printf("**pz+1 = %d\n", **pz+1);
// *pz + 1 第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址)
printf("*pz+1 = %p\n", *pz+1);
// *(*pz + 1) 二维数组第一个元素中第二个元素的值:4
printf("*(*pz+1) = %d\n", *(*pz+1));
// pz + 1 二维数组第二个元素的地址
printf("pz+1 = %p\n", pz+1);
// *(pz + 1) 二维数组第二个元素的地址(即第二个一维数组的地址)
printf("*(pz+1) = %p\n", *(pz+1));
// **(pz + 1) 二维数组第二个元素中第一个元素的值:6
printf("**(pz+1) = %d\n", **(pz+1));
// pz[0][0] 二维数组第一个元素中第一个元素的值:2
printf("pz[0][0] = %d\n", pz[0][0]);
// pz[2][1] 二维数组第三个元素中第二个元素的值:3
printf("pz[2][1] = %d\n", pz[2][1]);
// *(*(pz + 2) + 1) 二维数组第三个元素中第二个元素的值:3
printf("*(*(pz+2) + 1) = %d\n", *(*(pz + 2) + 1));
return 0;
}
为了方面理解和对比,下面表格里面对应的是打印内容和对应的输出值(mac):
打印内容 | 输出的值 | 注释内容 |
zippo | 0x7ff7bfb73df0 | 二维数组的首元素地址(即zippo[0]的地址,类型为int (*)[2]) |
zippo + 1 | 0x7ff7bfb73df8 | 指向二维数组第二个元素的地址(即zippo[1]的地址,类型为int (*)[2]) |
zippo[0] | 0x7ff7bfb73df0 | 二维数组第一个元素的地址(即第一个一维数组的地址,类型为int*) |
*zippo[0] | 2 | 二维数组第一个元素中第一个元素的值:2 |
zippo[0] + 1 | 0x7ff7bfb73df4 | 二维数组第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址) |
*(zippo[0] + 1) | 4 | 二维数组第一个元素中第二个元素的值:4 |
*zippo | 0x7ff7bfb73df0 | 二维数组第一个元素的地址(即第一个一维数组的地址,类型为int*) |
**zippo | 2 | 二维数组第一个元素中第一个元素的值:2 |
*zippo+1 | 0x7ff7bfb73df4 | 二维数组第一个元素(即第一个一维数组)中第二个元素的地址 |
*(*zippo + 1) | 4 | 二维数组第一个元素(即第一个一维数组)中第二个元素的值:4 |
zippo[0][0] | 2 | 二维数组第一个元素(即第一个一维数组)中第一个元素的值:2 |
*zippo[1] | 6 | 二维数组第二个元素(即第二个一维数组)中第一个元素的值:6 |
*(*zippo+1) | 4 | 二维数组第一个元素(即第一个一维数组)中第二个元素的值:4 |
*(zippo[0]+1) | 4 | 二维数组第一个元素(即第一个一维数组)中第二个元素的值:4 |
*(*(zippo+2) + 1) | 3 | 二维数组第三个元素(即第三个一维数组)中第二个元素的值:3 |
pz | 0x7ff7bfb73df0 | 二维数组的首地址 |
pz[0] | 0x7ff7bfb73df0 | 二维数组第一个元素的地址(即第一个一维数组的地址) |
*pz[0] | 2 | 二维数组第一个元素中第一个元素的值:2 |
pz[0]+1 | 0x7ff7bfb73df4 | 二维数组第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址) |
*(pz[0]+1) | 4 | 二维数组第一个元素中第二个元素的值:4 |
*pz | 0x7ff7bfb73df0 | 二维数组第一个元素的地址(即第一个一维数组的地址) |
**pz | 2 | 二维数组第一个元素中第一个元素的值:2 |
**pz+1 | 3 | 二维数组第一个元素中第一个元素的值加一:3 |
*pz+1 | 0x7ff7bfb73df4 | 第一个元素中第二个元素的地址(即第一个一维数组中第二个元素的地址) |
*(*pz+1) | 4 | 二维数组第一个元素中第二个元素的值:4 |
pz+1 | 0x7ff7bfb73df8 | 二维数组第二个元素的地址 |
*(pz+1) | 0x7ff7bfb73df8 | 二维数组第二个元素的地址(即第二个一维数组的地址) |
**(pz+1) | 6 | 二维数组第二个元素中第一个元素的值:6 |
pz[0][0] | 2 | 二维数组第一个元素中第一个元素的值:2 |
pz[2][1] | 3 | 二维数组第三个元素中第二个元素的值:3 |
*(*(pz+2) + 1) | 3 | 二维数组第三个元素中第二个元素的值:3 |
里面的有些地址一样是因为数组的地址和数组首元素的地址有时是相同的,但在概念上还是存在一些区别的,对于一维数组,数组的地址就是数组首元素的地址,对于多维数组,数组的地址是整个数组的地址,而数组首元素的地址是第一个子数组(或第一行数组)的地址,用指针的时候还是要注意一下的。