gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:58:09 25 4
gpt4 key购买 nike

我正在尝试以下代码

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com