什么类型和&返回C函数内的数组参数?

时间:2010-11-01 18:37:00

标签: c arrays function parameters operators

将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
}

感谢您提供的任何帮助! :)

1 个答案:

答案 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**的指针。)