Попробуйте установить *sour = s;
, тогда вы увидите, что значение 'x' изменилось внутри 'StrTest ()', и вы получите то поведение, которое ожидаете, что 'x' будет иметь значение 's'.
Когда вы устанавливаете sour = &s;
, как в приведенном здесь примере, вы меняете адрес, на который указывает локальный указатель 'sour', и StrTest () не узнает об этом,поскольку это локальная копия указателя, который вы передали.
Используя '* sour = s', вы изменяете значение переменной, на которую он указывает, на 'x'.
Вы можете думать об этом так, как локальный указатель 'sour' является локальной копией и создается и доступен только для 'strcpyTest ()' и уничтожается, когда он выходит за рамки видимости, однако он содержит ссылку на 'x', котораяВы передали так, что если вы разыменуете локальный указатель 'кислый', вы можете изменить значение x.
Иллюстрация:
Внутри
int strcpyTest(int dest, int *sour)
Примечание: Это неверный синтаксис, это просто для иллюстрации.
sour ----> [& x] // Содержит адрес переменной 'x', переданный функцией 'StrTest ()'* sour ----> [x] // Извлекает значение переменной 'x' (Разыменовывает 'sour', чтобы получить доступ к значению 'x')
sour = (Address) // Sets a new address to 'sour', which means it no longer points to '&x' that you passed in from 'StrTest()'
*sour = (Value) // Still points to '&x' from 'StrTest()', and assigns a new value to it
Если вы передаете '& x'или вы создадите указатель и передадите его в функцию 'strcpyTest ()', тогда вы обнаружите, что sour будет локальной копией этого указателя.
Примечание: если у вас есть структура данныхэто не мало, тогда я предлагаю вам вернуть указатель на него из strcpyTest () вместо того, чтобы возвращать фактическое значение, чтобы избежать ненужного копирования данных, кроме того, что совершенно нормально установить *sour = s;
.