二维数组不会衰减为指向指针的指针

Kra*_*ken 3 c arrays pointers

到目前为止我非常确定

int arr[4][5];
Run Code Online (Sandbox Code Playgroud)

然后arr将衰减为指针到指针。

这个链接证明我错了。

我不确定我是如何arr成为指针到指针的,但这对我来说似乎很明显。因为arr[i]将是一个指针,因此arr应该是一个指向指针的指针。

我是不是错过了什么。

M.M*_*M.M 5

是的,你错过了很多:)

为了避免另一面文字墙,我将链接到我今天早些时候写的解释多维数组的答案。

考虑到这一点,arr这是一个具有 4 个元素的一维数组,每个元素都是一个 5 的数组int&arr当用于or以外的表达式时sizeof arr,它会衰减为&arr[0]。但什么是&arr[0]?它是一个指针,而且重要的是,它是一个右值。

由于&arr[0]是一个指针,因此它不能进一步衰减。(数组会衰减,而指针不会)。此外,它是一个右值。即使它可以衰变成一个指针,该指针会指向哪里?您不能指向右值。(什么是&(x+y)? )

另一种看待它的方式是记住这int arr[4][5];是一个 20 秒的连续块int,在编译器的脑海中分为 4 组,每组 5 组,但在运行时在内存中没有特殊标记。

如果存在“双重衰变”,那么这意味着什么呢int **int *根据定义它必须指向 a 。但那在记忆中的什么地方呢int *?当然不会有一堆指针挂在内存中以防万一发生这种情况。