Работа с указателями в C++

155
17 декабря 2018, 02:40

Допустим, я объявляю переменную

int a = 5;

Чем будут отличаться два варианта объявления указателя:

int *p;
*p = &a;

и

int *p;
p = &a;

если в обоих случаях

cout<< *p;

выдает одинаковый результат 5?

Answer 1
int *p;
*p = &a;

Отличие будет в том, что этот вариант не скомпилируется, так как вы пытаетесь записать в невыделенную память для целочисленного значения адрес переменной a

Answer 2

Объявления у вас одинаковы -

int *p;

А вот присваивания - разные...

*p = &a;

Присваивание значению по адресу p значения адреса переменной a, что
1. в режиме C++ без дополнительного преобразования является ошибкой и не компилируемо;
2. если бы даже было компилируемо, то в cout << *p вывести 5 могло только по очень невероятной случайности - и то вряд ли: ну не используются обычно такие адреса (а в *p в этом случае находится именно адрес a) для реальных переменных...;
3. записывает неопределенную (ибо переменная p не инициализирована) область памяти, что является UB, могущим в хорошем случае аварийно тормознуть программу.

Второе присваивание

p = &a;

помещает в переменную p адрес a, так что *p представляет собой по сути псевдоним a, и выводимое в этом случае значение cout << *p действительно является значением переменной a.

READ ALSO
Не работает SocketIO в проекте cocos2d

Не работает SocketIO в проекте cocos2d

Я создал локальный сервер на node js, к которому должны подключаться клиенты и сохраняться в массиве:

192
Как установить скроллинг для виджета

Как установить скроллинг для виджета

Делаю виджет — диаграмму времени, которая будет отображать посчитанные моменты времени для разных групп объектов:

189
Как получить значение свойства объекта?

Как получить значение свойства объекта?

Есть два класса, Товары и Отделы (департамент), и их интерфейсы (свои сеттеры и геттеры)При добавлении товара сразу можно указать, к какому...

191