Адрес массива
int t[10];
int * u = t;
cout << t << " " << &t << endl;
cout << u << " " << &u << endl;
выход:
0045FB88 0045FB88
0045FB88 0045FB7C
Вывод для u
имеет смысл.
Я понимаю, что t
и &t[0]
должны иметь одинаковое значение, но почему &t
тоже то же самое? Что означает & t на самом деле означает?
Ответы
Ответ 1
Когда <<20 > используется сам по себе в выражении, происходит преобразование между массивами и указателями, это создает указатель на первый элемент массива.
Когда t
используется как аргумент оператора &
, такого преобразования не происходит. &
затем явно принимает адрес t
(массив). &t
является указателем на массив в целом.
Первый элемент массива находится в той же позиции в памяти, что и начало всего массива, и поэтому эти два указателя имеют одинаковое значение.
Ответ 2
Фактический тип t
равен int[10]
, поэтому &t
- это адрес массива.
Кроме того, int[]
неявно преобразуется в int*
, поэтому t
преобразует в адрес массива первый элемент массива.
Ответ 3
t
- это адрес массива, &t
- это еще указатель на массив, поэтому указанный адрес идентичен.
Хорошей ссылкой я нашел форум cplusplus, который очень хорошо объясняет эту концепцию.
Как указано там &array
:
Это одно из исключений, когда правило не применяется. Он принимает его как указатель на массив. Он снова укажет на первый элемент массива, но если вы добавите его к этому указателю, он укажет на адрес места сразу после последнего элемента массива (так же, как вы пропустили массив).
Ответ 4
Нет переменной с именем t
, так как вы не можете ее изменить. Имя t
просто ссылается на адрес первого элемента (а также имеет связанный с ним размер). Таким образом, обращение адреса адреса на самом деле не имеет смысла, а C "сворачивает" его на просто адрес.
То же самое происходит для случая функций:
int foo(void)
{
return 12;
}
printf("%p and %p\n", (void *) foo, (void *) &foo);
Это должно печатать одно и то же, поскольку нет переменной, содержащей адрес foo
, адрес которого, в свою очередь, можно взять.