Фото ниже.
Я не совсем понял почему разные адреса.
Но логически подумав я предполагаю, что,
Изначально мы создаем обычную переменную со значением, она же в свою очередь имеет свой адрес.
указателю 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 - ссылка
Адрес а хранится в ра. А адрес ра - другой.
Ссылки - это ссылки, а указатели - это указатели. Зачем ты их смешиваешь?
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!");
но это приведет к копированию значения, что не оптимально по быстродействию.
Чтобы "совсем" всё понимал, нужно начинать обучение с Си, а не с С++
Иначе будет такая каша в голове, как сейчас
у-у, указатели вообще штука сложная. но адреса разные, потому каждый раз им присваивается рандомные места в памяти
#include "iostream"
int main(){
int a=10, *p, *&pr=p;
pr=&a; std::cout<<*pr;}
тут pr - ссылка (псевдоним) указателя p