#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个有什么区别?
答案 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
的指针,该指针已经是指针。