Различие ссылок и указателей C++
Опишите, пожалуйста, чем 1 код отличается от 2. Не понимаю как работает с памятью второй и почему результат тот же. Я новичок, не бейте
void Foo (int *pa)
{
(*pa)++;
}
void main()
{
int a = 0;
cout << a << endl; //выводится 0
Foo(&a);
cout << a << endl; //выводится 1
}
void Foo (int &a)
{
a++;
}
void main()
{
int a = 0;
cout << a << endl; //выводится 0
Foo(a);
cout << a << endl; //выводится 1
}
Ответы (1 шт):
Ссылка работает так-же как неизменяемый указатель, но без звёздочек.
int a = 7 ;
int * const pa = & a;
int & la = a ;
int & la = * pa ; // эффект тот-же
a - это переменная целочисленного типа. l-value
pa - это переменная типа указателя. Указателю можно присвоить только адрес l-value объекта.
При добавлении звёздочки * указатель превращается в l-value объект.
la - это переменная типа ссылки. Она может указывать только на l-value объект.
a += 1 ;
(*pa) += 1 ; // === a += 1 ;
la -= 1 ; // === a -= 1 ;
При передачи аргументом в функцию происходит копирование. Копирование ссылки происходит путём копирования указателя, а не значения.
void Foo (int a)
void Foo (int *pa)
void Foo (int & la)
a - это новая локальная переменная с копией числа.
pa - это новый локальный указатель (объект куда он указывает остаётся нетронутым).
la - это новая локальная ссылка (объект куда ссылка указывает остаётся нетронутым).
Ссылки имеют ограничения в использовании по сравнении с указателем.
Ссылка не обязана иметь место хранения. У ссылки нет адреса. Команда получения адреса возвращает адрес реального объекта.
На ссылку нельзя назначить ссылку. Ссылка не может ссылаться на ссылку.
На ссылку нельзя выделить память.
На массив ссылок нельзя выделить память.
Ссылки нельзя хранить в массиве.
На ссылку как элемент структуры/класса можно.