【问题标题】:Why cannot use pointer of pointer as parameter to declare a function receive pointer of array为什么不能使用指针的指针作为参数来声明函数接收数组的指针
【发布时间】:2014-07-18 14:05:41
【问题描述】:

我有一个 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*
);"

想知道为什么

【问题讨论】:

  • 数组不是指针。重复:数组不是指针。
  • int **p; : *p 的类型是 int * 但数组顶部的地址是 int 0 的值,而不是指向 int 的指针。

标签: c pointers


【解决方案1】:

由于传递一个数组实际上是它的第一个元素的指针,所以数组的指针应该是指针的指针。

这不是它的工作原理。

除非它是sizeof 或一元& 运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,“N 元素”类型的表达式T 的数组将被转换为“指向T 的指针”类型的表达式,表达式的值将是数组第一个元素的地址。

receiveArray 调用中的表达式arr 的类型是“int 的四元素数组”。由于它不是sizeof 或一元& 运算符的操作数,因此它被转换为int * 类型的表达式,这是函数接收的内容。

在对receiveArrayPtr的调用中,表达式arr是一元&运算符的操作数,所以转换规则不适用;表达式&arr 的类型是“指向int 的4 元素数组的指针”,或int (*)[4]

这种转换称为数组名衰减

【讨论】:

    【解决方案2】:

    所以数组的指针应该是指针的指针。

    没有。 数组不是指针指向指针的指针指向数组的指针都是不同的类型。

    &arr 的类型为 int (*)[4]。您将 类型的参数传递给 4 个 int 的数组,而您的函数需要 int ** 类型的参数。

    将函数声明改为

    int receiveArrayPtr(int (*arrPtrPara)[4])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      相关资源
      最近更新 更多