Nie. Działa to w ten sposób, że mając wskaźnik do struktury masz w pamięci dwa bloczki.
Wyobraź sobie to w ten sposób. Tworzysz sobie strukture typu node w normalny sposób: node n;. W tym momencie zostaje wydzielony blok w pamięci powiedzmy, że blok numer 69, w którym przechowywana jest ta struktura, wartość w tym bloku to int i node*, ich wartosci są losowe przed inicjalizacją. Teraz tworzysz wskaźnik do node: node* wsk;. Rezerwujesz kolejny blok w pamięci na wskaźnik do node, powiedzmy, że pod adresem 80, wartość tego bloku jest randomowa, w momencie inicjalizacji sa tam jakieś smieci. I teraz chcesz, żeby ta zmienna (blok w pamięci) wskazywała Ci na twoją wcześniej utworzoną strukture (pamiętała adres w pamięci gdzie trzymana jest ta struktura). Robisz więc wsk = &n;. I wtedy wartość wsk wynosi 69. Gwiazdkując (dereferencując) ten wskaźnik trafiasz do twojej strukturki n. Jeśli zrozumiałeś ten wywód to będziesz już w stanie sam odpowiedzieć na pytanie co jest przekazywane do funkcji. Musisz jeszcze pamiętać, że argumenty funkcji są przekazywane przez wartość:
void fun(int x) { x = 100;}
int main(){
int a = 0;
fun(a); // a wciaz wynosi 0 bo funkcja pracuje na kopii zmiennej a
}
Wygląda to tak:
Bloki pamięci to kwadraty, w środku jest wartość, u góry nazwa zmiennej.
Nie wiem czy to widzisz, ale zmodyfikowałeś wartość innej zmiennej niż a, wartość innego bloku pamięci.
Na pewno widziałeś też taki kod:
void fun(int* x) {*x=100;}
int main(){
int a = 0;
int* wskaznik_na_a = &a;
fun(wskaznik_na_a); // wartosc a zmienia się
}
Tutaj też argument przekazywany jest przez wartość, ale tym razem wartość wskaźnika, a nie inta. Wrzucasz sobie inta do bloku pamięci o numerze 65 i przesyłasz wskaźnik do tego bloku. Dostajesz więc taką sytuacje:
Tym razem możesz modyfikować wartość a, bo masz dostęp do bloku pamięci, w którym jest nasza zmienna a.
A co jeśli będzie trzeba zmienić wartość samego wskaźnika, a nie wartość bloku na który ten wskaźnik pokazuje, jeśli zrobisz tak jak w pierwszym przypadku:
void fun(int* wsk){ wsk = 0;}
To dostaniesz coś takiego
Po wyjściu z funkcji zmienna kopia wsk znika, nie zmieniłeś więc wartości wskaźnika wsk. Idąc podobną logiką jak wcześniej, wystarczy, że dodasz gwiazdke i bedzie cacy:
void fun(int** wsk){ *wsk = 0;}
Teraz po wyjściu z funkcji wartość samego wskaźnika zmieni się, bo modyfikujesz blok pamięci w którym trzymana jest jego wartość.
Po krótkim wstępie wracając do Twojego przykładu: po pierwsze to nie jest pseudokod tylko C / C++ :P.
Całe to zamieszanie można rozwiązać korzystając z referencji, które są dostępne w C++, w C nie. Referencje to tak jakby druga nazwa na tą samą zmienną (ten sam blok w pamięci), wtedy możesz modyfikować jej wartość normalnie:
void fun(int& x){x=100;}
i wartość zmiennej przesłanej do funkcji zmieni się po wywołaniu funkcji.
A jeśli chodzi o wskaźniki, to jeśli nie rozumiesz tego co próbowałem wyjaśnić to musisz pamiętać jedynie tyle, że jeśli chcesz zmodyfikować argument to musi to wyglądać w ten sposób:
chcesz zmodyfikować inta to musisz przeslać int* wsk i zmodyfikować *wsk. Chcesz zmienić sam wskaźnik to musisz przesłać int** i podobnie zmodyfikować *wsk itd z dowolną ilością gwiazdek.
Mam nadzieję, że cokolwiek rozjaśniłem.