Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия, Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки
Последний раз редактировалось bondkim137 06.09.2016, 02:39, всего редактировалось 4 раз(а).
Сейчас все благоразумные среды живут в Flat-режиме, включая мобильные. Потому конверсия указателя в Int(64) и обратно впринципе на практике работает. По стандарту же сравнивать указатели на больше/меньше, а тем более, конвертировать в числа, можно только в рамках одного массива. На практике это была проблема во времена 640K DOS (часто решалась ad-hoc-ами, знающими реальную адресацию), и еще большей проблемой во времена первых 16-ти разрядных OS в защищенном режиме (вроде Win3.x), где с представлением о линейной адресации было туго.
Почему нижеприведенные строчки указывают на один и тот же адрес? cout<<a<<endl; cout<<&a<<endl;
В первой строчке происходит вызов оператора
Код:
basic_ostream& operator<<( const void* value );
и массив распадается до указателя на первый элемент. Во второй строчке явно берётся адрес массива == адрес первого элемента.
daun_autist
Re: C/С++ массивы, указатели
01.01.2017, 06:16
Я не совсем аккуратно написал. В первом случае происходит сначала array-to-pointer conversion, что даёт int*, после чего происходит pointer conversion и int* превращается в void*. Во втором случае &a даёт нам указатель на массив int(*)[2], после чего происходит pointer conversion и этот указатель превращается в void*.
Кстати, то, что указатели преобразуются в числовое значение не "напрямую", а проходя через void*, даёт, мне кажется, гарантии того, что числовые значения будут совпадать.