a,& a和& a [0]之间的类型差异是什么?

时间:2018-05-04 18:58:43

标签: c++

#include <iostream>

void arrayFunctionA(int* p)
{
}

int main()
{
    int a[3] = {7, 7, 7};
    arrayFunctionA(a);
    arrayFunctionA(&a[0]);
    arrayFunctionA(&a);
    return 0;
}

这将无法编译,arrayFunctionA(&a);上会出错。

因此,a&a[0]评估为int*,但&a不评估。

这3个有什么区别?

3 个答案:

答案 0 :(得分:5)

a是一个3 int类型的数组(int [3])。

固定数组衰减到指向其第一个元素的指针,因此在arrayFunctionA(a)中,a将衰减为指向其第一个元素的int*指针。

&a[0]是数组第一个元素的地址,类型为int *

&a是数组本身的地址,类型为int (*)[3](指向3 int数组的指针)。

因此,对于具有签名的函数

void arrayFunctionA(int* p);

传递a&a[0]将起到相同的作用,而传递&a将导致传递的参数值与函数参数不兼容。

答案 1 :(得分:1)

前两个例子是相同的。

  • 在第一个中,a衰减到指针并绑定到函数所采用的int*
  • 在第二个中,&a[0]&*(p + 0)相同,后者产生int*

第三个示例无法编译,因为将address-of运算符(&)应用于数组会产生指向数组的指针。在您的示例中,结果是int(*arr)[3],它无法绑定到int*,因此您会收到编译错误。

答案 2 :(得分:0)

Оn第一个电话arrayFunctionA(a);正在传递a的实际地址。

Оn第二次调用arrayFunctionA(&a[0]);正在传递索引0的实际地址。

第一次和第二次通话完全相同。你们都得到了索引0的地址(记住一个数组也是一个指针)。

在第三个调用中,您将获得a的指针,该指针已经是指针。