НЕ
Надежда Ермошина

[C++] Фигня какая-то с указателями

static int i = 777;
static int* p = &i;
cout << *(&i+4) << endl;

Почему не выводит 777? &i - адрес i, +4 - смещение до указателя, * - разыменование.

помог jura2922079:
>> если разименовывать адрес, то получится значение переменной, то есть *(&p) = это значение переменной, то есть
>> 0xC77000, а чтобы добраться до значения указателя, надо ещё раз разименовать, то есть:
>> cout << *((int*)*(&i+1)) << endl; даст как раз 777

АС
Александр Савельев

почему фигня то?
откуда может получиться 777 если вы выводите нечто отстоящее на 4 позиции от &i?

АS
Александр S

&i - указатель на i

&i + 4 - указатель на некую область памяти, расположенную на 4 * sizeof(int) старше, чем место хранения переменной i.

*(&i + 4) - интерпретация "неизвестно чего", хранящегося по адресу &i+4, как целого числа.

Число случайно там может оказаться 777. Для 32-битной архитектуры вероятность вывода числа 777 равняется 1 / (2^32), т. е. 1 к четырём миллиардам.
Более вероятным является вывод системной ошибки "память не может быть read" 🙂

DM
Dinara Mirzoeva

Потому что указатель тут вообще не используется. Он объявлен отдельно, и разместить его компилятор может где угодно по своему усмотрению.

Похожие вопросы
Срочно помогите решить пожалуйста!! ! c++ указатели и массивы
С++ Указатели на классы
Как достать указатель из TList на C++ и присвоить его другому указателю?
Имеет ли Microsoft Flash Player постоянные указатели на адрес памяти? Или указатели на указатели?
Имеет ли Adobe Flash Player постоянные указатели на адрес памяти? Или указатели на указатели?
C# работа с указателями в unsafe
C++ передача в функцию символьного массива и возвращения указателя на переработанные данные ?
C++ передача функции или указателя на функцию в метод
C++.Указатели и взятие адреса.
Указатели динамического массива, функции, c++