функция — путаница указателя с переполнением стека

Я очень запутался с указателями c ++ и ссылочными операторами. Моя главная путаница заключается в следующем (простом) коде:

#include <iostream>

using namespace std;

void changeInt(int &a)
{
a *= 3;
}

int main()
{
int n = 3;
changeInt(n);
cout << n << endl;

return 0;
}

В основном меня смущает, почему сменили адрес (&а) изменяет фактическую переменную (n). Когда я впервые попытался решить эту проблему, это был мой код:

#include <iostream>

using namespace std;

void changeInt(int &a)
{
*a *= 3;
}

int main()
{
int n = 3;
changeInt(n);
cout << n << endl;

return 0;
}

Но это дает мне ошибку. Почему, когда я меняю адрес, он меняет переменную, но когда я меняю значение, указанное адресом, я получаю ошибку?

0

Решение

Ваш второй пример не является допустимым C ++, вы можете только разыменовать указатель (или объект, тип которого перегружен operator*это не ваш случай).

Ваш первый пример передает параметр по ссылка (int &a это не «адрес а», это ссылка на а), поэтому изменение a на самом деле это изменение объекта, передаваемого функцией (в вашем случае, n)

3

Другие решения

Амперсанд (&) в этом контексте означает ссылка, не «адрес». Например.:

int some_int;

int & a = some_int; // Declare 'a', a reference to 'some_int'

int * p = &some_int; // '&' in this context is "the address of" 'some_int'

Ссылка во многом эквивалентна указателю, но ведет себя как тип значения.
Увидеть эта тема и запись в википедии Узнать больше.

2

Амперсанд указывает, что переменная передается по ссылке на вашу функцию, но внутри функции переменная обрабатывается так, как если бы она была передана по значению. Это синтаксический сахар, сделать написание кода, который принимает ссылки, проще для понимания.

1
По вопросам рекламы [email protected]