为什么不能使用指针指针作为参数来声明一个函数接收数组的指针

时间:2014-07-18 14:05:42

标签: c pointers

我有一个接收数组指针的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 *
);"

想知道原因

2 个答案:

答案 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])