![](/img/trans.png)
[英]What's the difference between type name() and type name = type()?
[英]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.