Адрес массива - PullRequest
       16

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

27 голосов
/ 07 декабря 2011
int t[10];

int * u = t;

cout << t << " " << &t << endl;

cout << u << " " << &u << endl;

выход:

0045FB88 0045FB88
0045FB88 0045FB7C

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

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

Ответы [ 3 ]

27 голосов
/ 07 декабря 2011

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

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

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

3 голосов
/ 07 декабря 2011

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

0 голосов
/ 07 декабря 2011

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

То же самое происходит с функциями:

int foo(void)
{
  return 12;
}

printf("%p and %p\n", (void *) foo, (void *) &foo);

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

...