2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3
 
 Re: C/С++ массивы, указатели
Сообщение06.09.2016, 02:36 
Аватара пользователя
Сейчас все благоразумные среды живут в Flat-режиме, включая мобильные. Потому конверсия указателя в Int(64) и обратно впринципе на практике работает. По стандарту же сравнивать указатели на больше/меньше, а тем более, конвертировать в числа, можно только в рамках одного массива. На практике это была проблема во времена 640K DOS (часто решалась ad-hoc-ами, знающими реальную адресацию), и еще большей проблемой во времена первых 16-ти разрядных OS в защищенном режиме (вроде Win3.x), где с представлением о линейной адресации было туго.

 
 
 
 Re: C/С++ массивы, указатели
Сообщение01.01.2017, 04:09 
bayah в сообщении #1148896 писал(а):
Есть массив:
int a[2] = {0,1};

Почему нижеприведенные строчки указывают на один и тот же адрес?
cout<<a<<endl;
cout<<&a<<endl;

В первой строчке происходит вызов оператора
Код:
basic_ostream& operator<<( const void* value );
и массив распадается до указателя на первый элемент.
Во второй строчке явно берётся адрес массива == адрес первого элемента.

 
 
 
 Re: C/С++ массивы, указатели
Сообщение01.01.2017, 06:16 
Я не совсем аккуратно написал.
В первом случае происходит сначала array-to-pointer conversion, что даёт int*, после чего происходит pointer conversion и int* превращается в void*.
Во втором случае &a даёт нам указатель на массив int(*)[2], после чего происходит pointer conversion и этот указатель превращается в void*.

Кстати, то, что указатели преобразуются в числовое значение не "напрямую", а проходя через void*, даёт, мне кажется, гарантии того, что числовые значения будут совпадать.

 
 
 [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group