Какой тип и возвращает для параметра массива внутри функции C? - PullRequest
1 голос
/ 01 ноября 2010

При передаче аргумента Array в функцию его адрес памяти копируется в параметр Array.Из-за этого:

  • sizeof() возвращает размер всего массива для аргумента Array (внутри вызывающей стороны)
  • sizeof() возвращает размер указателя для параметра Array(внутри вызывается функция)

Мой вопрос: какой тип параметра массива внутри функции?А точнее, какой тип возвращается при использовании оператора & для параметра Array?Это не указатель на массив типа и не указатель на тип, как показано в этом коде (помечены 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 Ответ

3 голосов
/ 01 ноября 2010

В большинстве случаев, когда вы используете массив, он распадается на указатель на свой начальный элемент.Итак, если у вас есть:

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[])), он фактически преобразуется так, что он точно такой же, как void f(int* x).Между ними нет никакой разницы: параметры типа массива совпадают с параметрами типа указателя.

После передачи массива в функцию все, что у вас есть, - это указатель на его начальный элемент, поэтому, если вы примените & оператор int*, вы получаете int** (указатель на int*).

...