Привет, у меня есть простой код, как этот
void func(int &x, int y, int* z){
int a = 3;
int b = 1;
cout << *z << endl;
x = *z + b;
cout << *z << endl;
y = *z + x;
z = &a;
cout << "func: x = " << x << endl;
cout << "func: y = " << y << endl;
cout << "func: *z = " << *z << endl;
cout << "func: a = " << a << endl;
cout << "func: b = " << b << endl;
return;
}
int main(){
int a = 2;
int b = 4;
func(b, a, &b);
cout << "main: a = " << a << endl;
cout << "main: b = " << b << endl;
return 0;
}
И для вывода я получаю
4
5
func: x = 5
func: y = 10
func: *z = 3
func: a = 3
func: b = 1
main: a = 2
main: b = 5
Поэтому мой вопрос: по какой причине значение * z изменяется после x = *z + b
потому что я не могу понять это сам.
заранее спасибо
x
является ссылкой на b
в основном (не путать с b
в func, который является отдельным). z
- указатель на b
в основном. Ссылки - это в основном указатели, но без синтаксиса *
или &
, и вы не можете заставить их указывать на что-то другое (там нет эквивалента z = &a
для ссылок).
Линия:
x = *z + b;
в основном делает:
b_in_main = b_in_main + b_in_func;
потому что оба x
и *z
относятся к одной и той же переменной.
x = *z + b;
изменяет значение z, потому что:
- здесь x - это int-ссылка, указывающая на вашу переменную стороны звонящего b
- z - указатель на int, содержащий адрес той же переменной b
Поэтому в этот момент x и z относятся к одной и той же вещи.
Поэтому присвоение нового значения x означает присвоение этого значения b. Поскольку z указывает на b, после этого считывание z дает вам значение, присвоенное x.
Вы можете убедиться в этом, например, написав и сравнив адрес x и значение z:
cout << "(1) z is: " << z << " - &x is: " &x
// should be the same
z = &a;
cout << "(2) z is: " << z << " - &x is: " &x
// should be the different
В вашем контексте оба значения будут идентичны до тех пор, пока вы не переназначите z.
Когда вы используете & перед аргументом, который вы передаете методу, он не копируется, а привязывается к нему.
Так что:
Вы меняете x, связанный с b
z изменяется, соответствующее b новому значению, потому что оно связано с ним.
Поскольку вы изменили его, указав на локальную переменную a
z = &a;
Следовательно, когда вы разыгрываете его, он дает вам значение локальной переменной a, которая равна 3