3.8.3 嵌套的数组
目录
P178
补充一下指针的知识
在C语言中,二维数组 A 的 *A 和 **A 的含义可以通过数组与指针的关系来理解。以下是详细解释:
1. 二维数组的内存布局
假设定义了一个二维数组:
int A[3][2] = {{1, 2}, {3, 4}, {5, 6}};
内存中按行优先顺序连续存储:
A[0][0] (1) | A[0][1] (2) | A[1][0] (3) | A[1][1] (4) | A[2][0] (5) | A[2][1] (6)
2. *A 的含义
A是二维数组名,类型为int[3][2](数组的数组)。- 在大多数表达式中(如
*A),数组会退化为指向其首元素的指针,即A退化为&A[0],类型为int (*)[2](指向一维数组的指针)。 *A的解引用:*A等价于A[0],即第0行的首地址(类型为int[2])。- 但
A[0]也会退化为指向该行第一个元素的指针(&A[0][0],类型int *)。
示例:
printf("%p\n", *A); // 输出 &A[0][0] 的地址
printf("%d\n", (*A)[1]); // 输出 A[0][1] 的值(2)
3. **A 的含义
*A已经退化为&A[0][0](类型int *),指向第0行第0列的元素。**A的双重解引用:**A等价于*(*A),即A[0][0]的值。
示例:
printf("%d\n", **A); // 输出 A[0][0] 的值(1)
另外,int (*A[4])是一个指针数组:由于方括号的优先级比星号高,所以A[4]表示数组,int *表示数组中每个元素的类型。*A不是空指针,但是**A是空指针
嵌套数组另一种声明如下

在看一个例子


浙公网安备 33010602011771号