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

int t[10]; int * u = t; cout << t << " " << &t << endl; cout << u << " " << &u << endl; 

вывод:

 0045FB88 0045FB88 0045FB88 0045FB7C 

Выход для u имеет смысл.

Я понимаю, что t и &t[0] должны иметь одно и то же значение, но как же получается &t тоже? Что на самом деле означает?

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

Когда t используется как аргумент оператора & , такое преобразование не происходит. Затем & затем явно принимает адрес t (массив). &t – указатель на массив в целом.

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

Фактический тип tint[10] , поэтому &t – адрес массива.
Кроме того, int[] неявно преобразуется в int* , поэтому t преобразует в адрес массива первый элемент массива.

Нет переменной с именем t , так как вы не можете ее изменить. Имя t просто ссылается на адрес первого элемента (а также имеет связанный с ним размер). Таким образом, обращение адреса адреса на самом деле не имеет смысла, а C «сворачивает» его на просто адрес.

То же самое происходит в случае функций:

 int foo(void) { return 12; } printf("%p and %p\n", (void *) foo, (void *) &foo); 

Это должно печатать одно и то же, поскольку нет переменной, содержащей адрес foo , адрес которого, в свою очередь, можно взять.

  • Как передать функцию в качестве параметра в C?
  • Размещение звездочки в объявлениях указателей
  • Безопасно ли удалить указатель NULL?
  • Возвращаемый массив в функции
  • Это неуказанное поведение для сравнения указателей с разными массивами для равенства?
  • Почему существует оператор стрелки (->) в C?
  • Возrotation массива с использованием C
  • Указатель против ссылки
  • Почему я не могу обработать массив как указатель в C?
  • Что такое имя массива в c?
  • Является ли хорошей практикой освобождение NULL-указателя в C?
  • Давайте будем гением компьютера.