C/C++

Не совсем понял как работает C++ код с указателями

Фото ниже.
Я не совсем понял почему разные адреса.
Но логически подумав я предполагаю, что,
Изначально мы создаем обычную переменную со значением, она же в свою очередь имеет свой адрес.
указателю pa в ячейку где хранятся данные (я не знаю как правильно выразиться) мы сохраняем адрес переменной интовой 'a'.
Но если выводить в консоль, то адреса разные.
Видимо я так понимаю, 'pa' указатель имеет свой адрес в памяти, а сам хранит в себе указатель на переменную 'a'. На сколько логически подумав мне кажется это верным.
'&a' и 'pa' выдадут один адрес. Но просто в голове понять смысл всего этого крайне сложно, хотя я вроде бы все более менее понимаю. Естественно для мелких задач, а именно самых тривиальных которые я могу сейчас написать вряд-ли такое пригодится. Но для более сложных я и представить с трудом могу где это может сыграть роль. Может кто нибудь привести пример где это сыграет роль?

Если посмотреть второе фото, то можно увидеть ошибку которую мне выдает VS. Я не очень понял суть ошибки, но если инициализировать не переменной 'a', а указателем 'pa', то ошибки нет. И вот тут я вообще в тупике каком-то. В этом какой смысл как то совсем не понятно, хотя на разных сайтах читал об этом. И разницу ссылок и указателей я понимаю.
int a = 5; // a - переменная
int* pa; // pa - указатель
pa = &a; // &a - операция взятия адреса переменной a и присвоение его указателю pa
cout << pa << " == " << &a << '\n'; // адреса совпадают
*pa = 10; // *pa - операция разыменования указателя с присвоением нового значения области памяти на которую он указывает
cout << *pa << " == " << a << '\n'; // значения совпадают
// Указатель - переменная, которая хранит адрес переменной
int** ppa = &pa; // для хранения адреса такого указателя, требуется указатель на указатель
cout << ppa << " == " << &pa << '\n'; // адреса совпадают
int& ra = a; // ra - ссылка
ИП
Иван Петров
65 813
Лучший ответ
Адрес а хранится в ра. А адрес ра - другой.
Женис Шуленов
Женис Шуленов
94 027
Павел Ашмарин Так, это в принципе я понял, а вот какой смысл имеют 'ссылка на указатель'? Можете рассказать пожалуйста как вы это понимаете
Женис Шуленов Лучше один раз увидеть, чем сто раз услышать :)
#include "iostream"
int main(){
int a=10, *p, *&pr=p;
pr=&a; std::cout<<*pr;}
тут pr - ссылка (псевдоним) указателя p
Женис Шуленов Для понимания смысла ссылок: просто в main или другой функции ссылки обычно не имеют смысла - разве что запутать программу. А вот передача в функцию параметра по ссылке имеет смысл, тут действует особое правило - если передается просто переменная, в функции создается ее копия, что влечет дополнительные затраты и не позволяет прямо передать изменения обратно в вызывающую программу. А вот если параметр в функцию передается по ссылке, то это эквивалентно автоматически разыменовываемому указателю, тогда функция работает не с копией параметра, а прямо с самим переданным параметром.
Ссылки - это ссылки, а указатели - это указатели. Зачем ты их смешиваешь?

int a = 5;
int& ref_a = a; // вот ссылка
int* p_a = &a; // вот указатель

В обоих случаях &, но у ссылок он после типа, у указателей перед значением, а после типа *.

И твой пример имеет мало отношения к реальности. Примитивные типы вроде интов используют без указателей и без ссылок. Для сложных типов вроде string, vector и т. д. используют ссылки, когда передают в функцию:

void alert(std::string& str) {
cout << str;
}
alert("Hello, world!");

можно конечно и без ссылки:

void alert(std::string str) {
cout << str;
}
alert("Hello, world!");

но это приведет к копированию значения, что не оптимально по быстродействию.
Karlen Margaryan
Karlen Margaryan
92 464
Павел Ашмарин Естественно у меня код толком ничего и не делает кроме как вывода значений. У меня цель понять связь их между собой. Я понимаю что такое указатель и ссылка. Но я в некотором коде заметил что человек использовал ссылку на указатель, т. е. имело такой вид '*&'. Мне на данный момент теперь только лишь это непонятно как работает, хотя я лишь предполагаю что и у адреса этой переменной и у хранящего значения, один адрес. Но это лишь догадки
Чтобы "совсем" всё понимал, нужно начинать обучение с Си, а не с С++

Иначе будет такая каша в голове, как сейчас
Андрей Целуйко
Андрей Целуйко
37 945
Павел Ашмарин Спасибо за помощь блин
у-у, указатели вообще штука сложная. но адреса разные, потому каждый раз им присваивается рандомные места в памяти