c - 等同于两个二维指针-二维数组

标签 c pointers

我正在尝试以下代码

#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 是一个 2d 指针(指向指针的指针),其中包含 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。

上面的解释对吗?有点奇怪。

最佳答案

数组不是指针。

嗯,还有更多...

多维数组不是二重、三重等指针。

因此,您所拥有的一切都是错误的,您的程序多次调用了未定义的行为,并且没有什么是您可以期待的。

鉴于数组在内存中是连续的,您可以这样重写您的示例:

int A[3][4] = {{1,2,3,4},{5,6,7,8,},{9,10,11,12}};
int *p = &A[0][0];

printf("%d %d %p\n", A[0][0], *p, (void *)p);

关于c - 等同于两个二维指针-二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15980747/

相关文章:

c - 数组被视为常量指针,所以我们不能更改指针值但数组的单个元素可以更改,为什么?

c++ - 使用 fprintf 获取访问冲突写入位置 0x00000014

c - 指针的类型?

c - linux中修改注册字符设备中的文件操作

c - 从 C 中的用户定义函数返回指针

c - 结构节点释放

c - 传递给 C 函数的结构指针即使在前向声明后也不起作用

通过名称和函数指针在 C 中调用函数

有人能解释一下 C 语言中这条语句在内存中发生了什么吗?

c - **如何在二维数组中工作?