// 测试多维数组与指针
# include <stdio.h> int main(void) { int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; printf("a = %d, &a[0] = %d, &a[0][0] = %d, *a = %d, **a = %d ", a, &a[0], &a[0][0], *a, **a); printf("a[0] = %d, a[0][0] = %d ", a[0], a[0][0]); int b[2][2][2] = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}; printf("b = %d, &b[0] = %d, &b[0][0] = %d, &b[0][0][0] = %d ", b, &b[0], &b[0][0], &b[0][0][0]); printf("*b = %d, **b = %d, ***b = %d, b[0] = %d, b[0][0] = %d, b[0][0][0] = %d ", *b, **b, ***b, b[0], b[0][0], b[0][0][0]); return 0; }
/*
运行结果:
a = 6487584, &a[0] = 6487584, &a[0][0] = 6487584, *a = 6487584, **a = 1
a[0] = 6487584, a[0][0] = 1
b = 6487552, &b[0] = 6487552, &b[0][0] = 6487552, &b[0][0][0] = 6487552
*b = 6487552, **b = 6487552, ***b = 1, b[0] = 6487552, b[0][0] = 6487552, b[0][0][0] = 1
--------------------------------
Process exited after 0.01666 seconds with return value 0
请按任意键继续. . .
结论:
以二维数组为例
二维数组的起始元素为 a[0][0],它的地址可以表示为&a[0], &a[0][0], a[0], a, *a
基于以上例子,表达式 &a[0], &a[0][0], a[0], a, *a 的值都相等。
说明:
虽然它们的值相同,但 a 表示第 0 行的地址,而 *a 和 &a[0][0] 表示数组元素 a[0][0]
的地址。(a)前者为行地址,(*a)后者表示列地址。
行地址与列地址的区分:
例如 a 位数组第一行的地址, *a 表示数组第一行第 0 列的地址 **a 表示数组第一行
第 0 列的值(a[0][0]). 可得出结论,行地址做 * 运算后得到列地址,列地址做 * 运
算后得到数组元素。
*/