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

问题描述:

这可能听起来像以前问的问题 - 有一大堆的问题在那里大约在C数组和指针的区别,但它们都没有提供相当足够的信息来回答这个问题。我知道一个C数组的名称被C编译器视为一个指向内存块开始的指针,但是当我尝试将一个3x3的二维数组的名称赋值给int **在我的克利翁IDE,它凸显了分配,并说:C:为什么将整数的二维数组分配给int **会导致CLION突出显示该行?

不兼容的指针类型 '诠释*' 和 'INT [3] [3]'

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

我可以投的分配值(int **),当然高光消失,但 - 嘿 - 你可以施放C中的很多东西,并获得亮点消失。这并不意味着你要求的东西会起作用。

这只是一个克利翁(或者可能更恰当,铿锵整齐)的问题,或者是一个真正的问题?

[编辑]

对于某些情况下,对阵列/指针差异,所有其他的答案的问题是,很多人说这样的话“,因为一个3x3的阵列是不是INT **,这就是为什么! “谢谢,但这是一个相当无用的信息 - 提出问题的人可能已经知道3x3数组不是int ** - 问题是编译器如何在赋值之后处理结果int ** - 它是否会正确索引数组还是不?

+0

你可以发表有问题的线吗? – Blacksilver

+4

二维数组是**不是**指针数组,这就是为什么。 –

+1

'int **'是'int *'的顺序列表;一个'int [3] [3]'是一个由3个连续3个列表组成的连续列表。通过解析数组的第一个元素的地址,int []会衰减为int *',但这不能传递。 – zneak

虽然有人可以纠正我这一个多维阵列上可能没有,通常不为指针数组实现的,它与在它上面的一些syntaxic糖解引用一段连续的内存。

详见this

+0

谢谢@ orhtej2 - 不知道我错过了那个答案 - 它完美地回答了我的问题。 –

+0

是的,但“语法糖”,使得它与'INT **' –

+0

@AntonMalyshev我可以看到如何兼容?我提供的链接表明否则。 – orhtej2