Адрес массива
int t[10]; int * u = t; cout << t << " " << &t << endl; cout << u << " " << &u << endl;
вывод:
0045FB88 0045FB88 0045FB88 0045FB7C
Выход для u
имеет смысл.
Я понимаю, что t
и &t[0]
должны иметь одно и то же значение, но как же получается &t
тоже? Что на самом деле означает?
- Передача 2D-массива функции C ++
- Инициализация указателя в отдельной функции в C
- Можно ли программно определить размер массива C ++? А если нет, то почему?
- Почему некоторые люди предпочитают «T const &» над «const T &»?
- Использование стрелки (->) в C
- Указатели в c ++ после удаления
- Почему бы не использовать указатели для всего на C ++?
- Могу ли я взять адрес элемента «один конец прошлого» массива?
- Псевдонимы, вызываемые разыменованием, нарушат правила строгого сглаживания
- Как выровнять указатель в C
- Преобразование указателя в указатель между производными и базовыми classами?
- Массив для разметки указателя и передачи многомерных массивов в функции
- Функции хранилища C # в словаре
Когда t
используется сам по себе в выражении, происходит преобразование между массивами и указателями, это создает указатель на первый элемент массива.
Когда t
используется как аргумент оператора &
, такое преобразование не происходит. Затем &
затем явно принимает адрес t
(массив). &t
– указатель на массив в целом.
Первый элемент массива находится в том же месте в памяти, что и начало всего массива, и поэтому эти два указателя имеют одинаковое значение.
Фактический тип t
– int[10]
, поэтому &t
– адрес массива.
Кроме того, int[]
неявно преобразуется в int*
, поэтому t
преобразует в адрес массива первый элемент массива.
Нет переменной с именем t
, так как вы не можете ее изменить. Имя t
просто ссылается на адрес первого элемента (а также имеет связанный с ним размер). Таким образом, обращение адреса адреса на самом деле не имеет смысла, а C «сворачивает» его на просто адрес.
То же самое происходит в случае функций:
int foo(void) { return 12; } printf("%p and %p\n", (void *) foo, (void *) &foo);
Это должно печатать одно и то же, поскольку нет переменной, содержащей адрес foo
, адрес которого, в свою очередь, можно взять.