我正在尝试以下代码
#include<stdio.h>
int main()
{
int A[3][4] = {{1,2,3,4},{5,6,7,8,},{9,10,11,12}};
int **t = &A[0]; //I do this or **t = A,I guess both are equivalent
printf("%d %p\n\n",*t,A[0]);
return 0;
}
我期望发生的事情:
现在 t 是一个二维指针(指向指针的指针),它保存着 A[0] 的地址,而 A[0] 又保存着 A[0][0] 的地址。所以 *t 应该给我 A[0] 的值,即 A[0][0] 的地址,而 **t 应该给我 A[0][0] 的值,在这种情况下是 1 .
我得到了什么:
*t 给出的值是 1。试图找到 **t 是不可能的,因为它会导致分段错误。
谁能告诉为什么会这样?
我尝试了以下解释,但不确定它是否是“正确”的解释。t 保存 A[0] 的地址,但由于 A 是一个数组,而 A[0] 是一个数组指针(它“不完全是”一个指针),C 不会为指针 A 或 A[0] 分配内存特别是 UNLIKE 其他指针变量。它只为整个数组分配内存。所以 A[0] 和 A[0] 的地址(也就是 A[0][0] 的地址)本质上是相同的,都属于同一屋檐下,不像“独立”的实体。结果 t 又间接持有 A[0][0] 的地址,而 *t 给出了 A[0][0] 的值,即 1。
上面的解释正确吗?有点奇怪。