Адрес массива

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, адрес которого, в свою очередь, можно взять.