Разве массив / arrayname не всегда указатель на первый элемент в C? - PullRequest
6 голосов
/ 04 декабря 2009

То, что происходит ниже, не всегда ли имя массива является указателем на первый элемент в C?

int myArray[10] = {0};

printf("%d\n", &myArray); /* prints memadress for first element */
printf("%d\n", myArray); /* this prints a memadress too, shows that the name is a pointer */

printf("%d\n",sizeof(myArray)); /* this prints size of the whole array, not a pointer anymore? */
printf("%d\n",sizeof(&myArray)); /* this prints the size of the pointer */

Ответы [ 7 ]

18 голосов
/ 04 декабря 2009

Имя массива - это имя массива. Имя массива - это идентификатор, который идентифицирует весь объект массива. Это не указатель на что-либо.

Когда имя массива используется в выражении, тип массива автоматически неявно преобразуется в тип указатель на элемент в почти во всех контекстах (это часто называют «распадом типа массива»). Результирующий указатель является полностью независимым временным значением. Это не имеет никакого отношения к самому массиву. Это не имеет ничего общего с именем массива.

Два исключения, когда неявное преобразование не выполняется: оператор sizeof и унарный оператор & (address-of). Это именно то, что вы тестировали в своем коде.

5 голосов
/ 04 декабря 2009

Остерегайтесь типов.

  • Тип myArray равен int[10].
  • Тип &myArray равен int (*)[10] (указатель на int[10]).
  • При оценке тип myArray равен int *. То есть тип значения из myArray равен int *.
  • sizeof не оценивает свой аргумент. Отсюда sizeof(myArray) == sizeof(int[10]) != sizeof(int *).

Следствие:

  • myArray и &myArray являются несовместимыми указателями и не являются взаимозаменяемыми.

Нельзя правильно присвоить &myArray переменной типа int *foo.

4 голосов
/ 04 декабря 2009

Массив не является указателем. Однако, если имя массива используется в выражении, где оно не является субъектом ни оператора &, ни оператора sizeof, оно получит указатель на свой первый элемент.

3 голосов
/ 04 декабря 2009

Нет, массив является тем первым элементом (и остальными). Он не преобразуется в указатель, пока вы не передадите его в качестве аргумента функции.

1 голос
/ 04 декабря 2009

arrayname будет указывать на все элементы массива. Вот почему вы можете сделать (arrayname + 5) для указания на 5-й элемент в массиве.

0 голосов
/ 04 декабря 2009

do arrayname ++, и вы узнаете, что arrayname одновременно представляет весь массив, а не только начальный элемент .... по умолчанию он сохраняет начальный адрес первого элемента

0 голосов
/ 04 декабря 2009

Массив не является указателем, но его можно рассматривать как указатель на первый элемент массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...