Имя массива обычно оценивает адрес первого элемента массива, поэтому array
и &array
имеют одинаковое значение (но разные типы, поэтому array+1
и &array+1
будут not равно, если массив имеет длину более 1 элемента).
Есть два исключения: если имя массива является операндом sizeof
или унарным &
(адрес -of), имя относится к самому массиву. Таким образом, sizeof array
дает размер в байтах всего массива, а не размер указателя.
Для массива, определенного как T array[size]
, он будет иметь тип T *
. Когда / если вы увеличиваете его, вы переходите к следующему элементу массива.
&array
оценивает один адрес, но с учетом того же определения создает указатель типа T(*)[size]
- - т. е. это указатель на массив, а не на один элемент. Если вы увеличите этот указатель, он добавит размер всего массива, а не размер одного элемента. Например, с таким кодом:
char array[16];
printf("%p\t%p", (void*)&array, (void*)(&array+1));
Мы можем ожидать, что второй указатель будет 16 больше первого (потому что это массив из 16 символов). Поскольку% p обычно преобразует указатели в шестнадцатеричном виде, он может выглядеть примерно так:
0x12341000 0x12341010