Объявление
node x = { 100 };
выделяет память для структуры узла и инициализирует ее.Оператор
change_addr(&x);
берет адрес памяти этой структуры, который является просто числом, скажем, 1000, и передает его по значению в функцию change_addr ().Внутри этой функции вы добавляете 100 к вашей локальной копии указателя с именем ptr
, что указывает на область памяти далеко за пределами места, где расположен x (если x был массивом, а неединственная структура, это будет указывать на 101-й элемент).Затем вы возвращаетесь, который отбрасывает вашу локальную копию адреса и возвращается к исходному кадру стека, где x никогда не изменялся.
Внутри функции change_addr () вы могли бы изменить содержимое структуры, получив к ней доступ через указатель.Например, ptr->data = 200
изменил бы свои данные.Но если по какой-то причине вы хотите изменить сам адрес указателя, вам придется создать указатель на указатель и передать его функции, принимающей соответствующий тип аргумента.