我有一个接收数组指针的c函数作为它的一个参数。
由于传递数组实际上是其第一个元素的指针,因此数组的指针应该是指针的指针。
int arr[]={0,1,2,3};
int main(){
receiveArray(arr);
receiveArrayPtr(&arr);
}
int receiveArray(int *arrPara){....}
int receiveArrayPtr(int **arrPtrPara){....} //Why cannot do this?
错误讯息是
"期望'int **'但参数类型为'int()[4]'
void receiveArrayPtr(int * );"
想知道原因
答案 0 :(得分:4)
由于传递数组实际上是其第一个元素的指针,因此数组的指针应该是指针的指针。
这不是它的工作原理。
除非它是sizeof
或一元&
运算符的操作数,或者是用于初始化声明中的另一个数组的字符串文字,否则为类型的表达式" T
"的N元素数组;将转换为"指向T
"的类型的表达式,表达式的值将是数组的第一个元素的地址。
arr
调用中表达式receiveArray
的类型是" int
"的4元素数组。由于不是sizeof
或一元&
运算符的操作数,因此它将转换为类型int *
的表达式,这是函数接收的。
在对receiveArrayPtr
的调用中,表达式arr
是一元&
运算符的操作数,因此转换规则不适用;表达式&arr
的类型是"指向int
"或int (*)[4]
的4元素数组的指针。
此转换称为数组名称衰减。
答案 1 :(得分:1)
所以数组的指针应该是指针的指针。
没有。 数组不是指针。 指向指针的指针和指向数组的指针都属于不同类型。
&arr
的类型为int (*)[4]
。您正在将类型指针的参数传递给4 int
的数组,而您的函数需要类型为int **
的参数。
将函数声明更改为
int receiveArrayPtr(int (*arrPtrPara)[4])