Адрес указателя на первый элемент массива
От: Neavirc  
Дата: 05.05.08 10:01
Оценка: 2 (1)
Скажите пожалуйста, почему адрес указателя на первый элемент массива точно такой же, как адрес самого первого элемента?

Пример:

#include <iostream>

using namespace std;

int main()
{
  int i[] = { 1, 2, 3 };
  cout << i << endl; // Приведение имени массива к указателю на его первый элемент. Эквивалентно &i[0] или &(*i)                                                                                                                                                                                 
  cout << &i << endl; // <-- Адрес указателя на первый элемент

  cout << endl;
}


Запускаем:

[sergey@myhost cpp]$ g++ main.cpp && ./a.out
0xbfe11848
0xbfe11848

Как такое может быть? Ведь указатель на int и собственно int — разные обьекты и должны иметь разные адреса Вот так:

int i = 100;                                                                                                                                                                                                  
int* p = &i;                                                                                                                                                                                                    
cout << p << endl;                                                                                                                                                                                              
cout << &p << endl;


Спасибо.
Re: Адрес указателя на первый элемент массива
От: dip_2000 Россия  
Дата: 05.05.08 10:03
Оценка:
Здравствуйте, Neavirc, Вы писали:

N>Скажите пожалуйста, почему адрес указателя на первый элемент массива точно такой же, как адрес самого первого элемента?

Это "фича" языка С(а вместе с ним и с++). Такое поведение указано в стандарте. так и задумано

N>Спасибо.

Re[2]: Адрес указателя на первый элемент массива
От: Neavirc  
Дата: 05.05.08 10:11
Оценка:
З_>Это "фича" языка С(а вместе с ним и с++). Такое поведение указано в стандарте. так и задумано

Спасибо, скачал стандарт, буду изучать

Я там опечатался немного, я ожидал такого поведения:

int i = 100;                                                                                                                                                                                                  
int* p = &i;                                                                                                                                                                                                    
cout << &i << endl;                                                                                                                                                                                              
cout << &p << endl;
Re[2]: Адрес указателя на первый элемент массива
От: AKh  
Дата: 05.05.08 10:11
Оценка:
Здравствуйте, dip_2000, Вы писали:

N>>Скажите пожалуйста, почему адрес указателя на первый элемент массива точно такой же, как адрес самого первого элемента?

_>Это "фича" языка С(а вместе с ним и с++). Такое поведение указано в стандарте. так и задумано

Искал в 8.3.4, 8.3.1 — не нашел. Где?
Re: Адрес указателя на первый элемент массива
От: Roman Odaisky Украина  
Дата: 05.05.08 10:30
Оценка:
Здравствуйте, Neavirc, Вы писали:

N>Скажите пожалуйста, почему адрес указателя на первый элемент массива точно такой же, как адрес самого первого элемента?

N> int i[] = { 1, 2, 3 };
N>Как такое может быть? Ведь указатель на int и собственно int — разные обьекты и должны иметь разные адреса :wow: Вот так:

Ты хотел, чтобы выражение &i имело тип int**? А зачем? Всё равно его нельзя изменить.
До последнего не верил в пирамиду Лебедева.
Re[3]: Адрес указателя на первый элемент массива
От: dip_2000 Россия  
Дата: 05.05.08 10:31
Оценка: 1 (1)
Здравствуйте, AKh, Вы писали:

AKh>Здравствуйте, dip_2000, Вы писали:


N>>>Скажите пожалуйста, почему адрес указателя на первый элемент массива точно такой же, как адрес самого первого элемента?

_>>Это "фича" языка С(а вместе с ним и с++). Такое поведение указано в стандарте. так и задумано

AKh>Искал в 8.3.4, 8.3.1 — не нашел. Где?


4.2 Array-to-pointer conversion
Re[2]: Адрес указателя на первый элемент массива
От: Neavirc  
Дата: 05.05.08 10:40
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Ты хотел, чтобы выражение &i имело тип int**? А зачем? Всё равно его нельзя изменить.


Когда я прочитал у Страуструпа, что имя массива приводится к указателю на его элемент, я подумал, что на стеке действительно создается самый бычный указатель. Не обнаружив указателя, я удивился и пошел на РСДН искать правду

Использовать указатель я никак не собирался.
Re[3]: Адрес указателя на первый элемент массива
От: Кодт Россия  
Дата: 05.05.08 10:41
Оценка: 1 (1)
Здравствуйте, Neavirc, Вы писали:

N>Я там опечатался немного, я ожидал такого поведения:

N>int i = 100;
N>int* p = &i;
N>cout << &i << endl;
N>cout << &p << endl;

Так ведь неявное приведение массива к указателю — (int*)a (где int a[]={....}) является rvalue и не имеет адреса.
Ну а то, что массив целиком расположен в памяти там же, где расположены его элементы, — ничего удивительного
Ситуация чем-то похожа на
struct Foo
{
    int x;
    operator int*() { return &x; }
};

Foo foo;
cout << &foo << endl; // указатель на структуру
cout << foo << endl; // эквивалентно (int*)foo
cout << &foo[0] << endl; // эквивалентно &*((int*)foo+0), & и * сокращаем, +0 тоже сокращаем...
cout << (&foo == &foo.x) << endl; // true


Но как только ты заводишь ещё одну переменную для хранения указателя — то эта переменная обретает собственный адрес.
Заведёшь две переменные — будут два разных адреса...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Адрес указателя на первый элемент массива
От: Bell Россия  
Дата: 05.05.08 11:02
Оценка: 3 (1) +1
Здравствуйте, Neavirc, Вы писали:

N>  int i[] = { 1, 2, 3 };
N>  cout << i << endl;


Здесь неявно выполняется стандартное преобразование array to pointer conversion, результатом которого является указатель на первый элемент массива.

N>  cout << &i << endl;


Здесь преобразование array to pointer conversion не выполняется, а берется адрес объекта "массив". Начало объекта "массив" совпадает с началом первого элемента массива, поэтому получаются одинаковые значения.

ЗЫ
Чтобы убедится, что ты работаешь с разными сущностями, попробуй такой пример:


int main()
{
  int i[] = { 1, 2, 3 };
  cout << i << '\t' << i+1 << endl;                               
  cout << &i << '\t' << &i+1 << endl;
  cout << endl;

  return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re[3]: Адрес указателя на первый элемент массива
От: igna Россия  
Дата: 05.05.08 13:15
Оценка:
Здравствуйте, Neavirc, Вы писали:

>Когда я прочитал у Страуструпа, что имя массива приводится к указателю на его элемент, я подумал, что на стеке действительно создается самый бычный указатель.


Так он и создается иногда. Хотя строго говоря не при приведении, а при последующем копировании приведенного указателя.
Re[2]: Адрес указателя на первый элемент массива
От: Neavirc  
Дата: 05.05.08 14:37
Оценка: 1 (1)
Кодт, Bell, большое спасибо за помощь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.