C:为什么将 2D 整数数组分配给 int** 会导致 CLION 突出显示该行?

C: Why does assigning a 2D array of ints to an int** cause CLION to highlight the line?

这听起来像是一个以前问过的问题 - 关于 C 中数组和指针之间的区别有很多问题,但是 none 其中提供了足够的信息来回答这个问题。

我知道 C 编译器将 C 数组的名称视为指向内存块开头的指针,但是当我尝试将 3 x 3 二维整数数组的名称分配给一个int ** 在我的 CLION IDE 中,它突出显示了作业并说:

Incompatible pointer types 'int * *' and 'int [3][3]'

int x[3][3];
int **px = x;  <-- warning here

我可以将分配的值投射到 (int**),高亮当然会消失,但是 - 嘿 - 你可以在 C 中投射大量的东西并让高亮消失。并不意味着您所要求的会起作用。

这只是一个 CLION(或者更恰当地说,clang tidy)问题,还是一个真正的问题?

[编辑]

在某些情况下,关于 array/pointer 差异的所有其他答案的问题在于,他们中的许多人都说 "because an 3x3 array is not a int **, that's why!" 谢谢,但这是一条相当无用的信息 - 提问者问题可能已经知道 3x3 数组不是 int ** - 问题是编译器如何在分配后处理结果 int ** - 它是否会正确索引数组?

虽然有人可以纠正我这个多维数组可能不是而且通常不会实现为指针数组,但它是连续的内存块,上面有一些语法糖用于取消引用。

详情见this