将Array Argument传递给Function时,它的内存地址被复制到Array Parameter中。因此:
sizeof()
返回Array Argument(内部调用者)的整个数组的大小sizeof()
返回数组参数(内部称为函数)我的问题是,函数内部的数组参数是什么类型的?更具体地说,在数组参数上使用& 运算符时返回什么类型?它不是指向数组类型的指针,也不是指向类型的指针,如此代码中所示(标记为 BAD ):
void doSomething(int arrayParam[10]);
int main()
{
int array[10] = { 0 };
int (*arrayPtr)[] = &array; // OK
printf("%p\n", array); // 0x7fff5fbff790
doSomething(array);
return 0;
}
void doSomething(int arrayParam[10])
{
printf("%p\n", arrayParam); // 0x7fff5fbff790
int (*arrayPtr)[] = &arrayParam; // BAD: Initialization from incompatible pointer type
int * element0Ptr = &arrayParam; // BAD: Initialization from incompatible pointer type
element0Ptr = arrayParam; // OK
element0Ptr = &arrayParam[0]; // OK
}
感谢您提供的任何帮助! :)
答案 0 :(得分:3)
大多数情况下,当您使用数组时,它会衰减到指向其初始元素的指针。所以,如果你有:
void f(int* x);
int array[10];
int* initial_element_of_array = array; // array decays to a pointer to initial element
f(array); // same here
f()
获取指向array
的初始元素的指针。
一开始相当混乱的事情是,如果一个函数有一个数组类型的参数(就像你有void f(int x[])
那样),实际上它被转换为与{{完全相同1}}。它们之间没有区别:数组类型参数与指针类型参数相同。
将数组传递给函数后,您所拥有的只是指向其初始元素的指针,因此,如果您将void f(int* x)
运算符应用于&
,则会获得int*
(指向int**
的指针。)