Я ожидаю, что результат не определен или что-то, но вывод «10», почему?
Я предполагаю, что память уничтожается после вызова функции.
#include <iostream>
void f(int *p)
{
int l = 20;
int *k = &l;
p = k;
}
int main()
{
int i = 10;
int *j = &i;
f(j);
std::cout << *j;
return 0;
}
Результат не определен. Вы передаете указатель j
по значению, поэтому вы изменяете его копию внутри функции. Оригинал j
остается без изменений, поэтому результат все еще 10
,
Программа хорошо сформирована как локальная переменная l
является не доступ за пределами f()
как указатель j
неизменен в main()
(копия указателя j
передается f()
).
Разложим ваш код.
Вы сначала назначаете 10 для i
, Тогда сделай j
указать на адрес i
,
В f вы устанавливаете значение p
, а не значение, которое оно указывает на, в k
, Как передано в качестве параметра f()
, значение p копируется (адресное значение).
Следовательно, вы никогда не изменяете значение, указанное j
, просто местное значение j
в f()
поэтому он остается равным 10
,
В коде нет ничего плохого. Параметр f
не передается по ссылке, поэтому f
не имеет возможности изменить j
, следовательно j
еще указывает на i
после f
выходы.
Вы запутались в передаче по ссылке / передаче по значению. Когда вы передаете указатель, сам указатель — это число, которое вы передаете f()
функция, указывающая на кусок памяти; изменение переменной * p в f()
(а не кусок памяти, где *p
указывает на) не будет иметь никакого эффекта в main()
функция.
Указатель — это просто переменная, которая содержит адрес памяти. Само по себе оно передается по значению; только переменная на который указывает указатель передается по ссылке.