Mam następujący dylemat:
Dlaczego jedna funkcja operuje na kopiach, a druga na wartościach oryginalnych?
Jak to się ma do stosu?
- W przypadku obu wywołań funkcji, przesyłane są do niej adresy wskaźników (jako argumenty formalne funkcji)
- W momencie wywołania funkcji, na stos odkładana jest ramka stosu. W przypadku funkcji swap1(), parametrem funkcji jest adres wskaźnika pa oraz pb, w przypadku swap2 kolejno &pc oraz &pd.
- W funkcji do wskaźnika x przypisywana jest wartość wskaźnika y(adres zmiennej a) i odwrotnie: do wskaźnika y, przypisywana jest wartość wskaźnika x(adres zmiennej b). Jest to więc tak na prawdę przypisanie wartości wskaźników -> adresów zmiennych.
I teraz pytanie zasadnicze: W obu przypadkach w funkcjach są tworzone kopie wskaźników na potrzeby funkcji, ale pierwsza funkcja operuje na zmiennych lokalnych, a druga na zmiennych na rzecz których została wykonana, czyli po za ramką stosu. Dobrze to rozumiem?
int main()
{
int a = 666, b = 2137;
int *pa= &a;
int *pb= &b;
printf ("%d, %d\n", *pa, *pb);
swap1(pa, pb);
printf ("%d, %d\n", *pa, *pb);
int c = 1, d = 999;
int *pc= &c;
int *pd= &d;
printf ("%d, %d\n", *pc, *pd);
swap2(pc, pd);
printf ("%d, %d\n", *pc, *pd);
}
void swap1(int *x, int *y)
{
int *temp = x;
x = y;
y = temp;
}
void swap2(int *x, int *y)
{
int *temp = x;
*x = *y;
*y = *temp;
}