Если я правильно понимаю, вы спрашиваете о двух частях кода. Первое, что вы отправили:
#include <iostream>
using std::cout;
void f(int* fptr) {
*fptr = 30; // 11
cout << "*fptr = " << *fptr << '\n'; // 12
}
int main() {
int x = 5; // 1
int* ptr = &x; // 2
f(ptr); // 21
cout << "*ptr = " << *ptr << '\n'; // 22
cout << "x = " << x << '\n'; // 23
}
В этом случае указатель всегда указывает на x, а в функции вы все равно изменяете значение x, так как именно на это указывает fptr. Если это помогает, вот демонстрация значения переменных в конце каждой строки: NE означает, что переменная в настоящее время не существует.
1. x = 5, ptr = NE, fptr = NE
2. x = 5, ptr = &x, fptr = NE
11. x = 30, ptr = &x, fptr = &x
12. x = 30, ptr = &x, fptr = &x
21. x = 30, ptr = &x, fptr = NE
После этого значения не изменяются, и все три оператора будут печатать 30.
Второй:
#include <iostream>
using std::cout;
void f(int*& fptr) {
int y = 30; // 11
fptr = &y; // 12
cout << "*fptr = " << *fptr << '\n'; // 13
}
int main() {
int x = 5; // 1
int* ptr = &x; // 2
f(ptr); // 21
cout << "*ptr = " << *ptr << '\n'; // 22
cout << "x = " << x << '\n'; // 23
}
В первом случае указатель передается по ссылке и указывает на y. Фактически, в этом случае строка 21 включает неопределенное поведение, так как y больше не существует. Опять же, построчный анализ:
1. x = 5, y = NE, ptr = NE, fptr == NE
2. x = 5, y = NE, ptr = &x, fptr == NE
11. x = 5, y = 30, ptr = &x, fptr == ptr
12. x = 5, y = 30, ptr = &y, fptr == ptr
13. x = 5, y = 30, ptr = &y, fptr == ptr
21. x = 5, y = NE, ptr = &y, fptr == NE
Значения снова не меняются после этого: однако в строке 22 вы пытаетесь взять адрес ptr
. Как видите, *ptr = y = NE
, а значит и поведение не определено. Выход может быть любым.
(Еще одно замечание: вам следует избегать using namespace std;
, так как это может вызвать конфликт имен; используйте using std::cout;
и аналогичные, как в приведенном выше коде.)