繁体   English   中英

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

[英]What's the type difference between a, &a, and &a[0]?

#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);arrayFunctionA(&a);错误arrayFunctionA(&a);

因此, a&a[0]计算结果为int* ,而&a则不。

这3个有什么区别?

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会导致传递的参数值和函数参数之间不兼容。

前两个示例相同。

  • 在第一个, a衰变到一个指针和结合于int*采取的功能。
  • 在第二个中, &a[0]等于&*(p + 0) ,它产生一个int*

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

arrayFunctionA(a);第一次调用arrayFunctionA(a); 实际地址a被传递。

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

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

在第三个电话你得到的指针a它已经是一个指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM