Рассмотрим следующие программы:
void f2 ( int * a, int * b) {
int c;
c = * a;
*a = *b;
*b = c;
}
int main () {
int a = 4, b = 5, c = 6;
f2 (&b, &c);
printf ("%d", c - a - b);
}
Здесь значения b
и c
меняются местами.
И еще один код:
# include <stdio.h>
void mystery (int *ptra, int *ptrb) {
int *temp;
temp = ptrb;
ptrb = ptra;
ptra = temp;
}
int main () {
int a = 2016, b=0, c= 4, d = 42;
mystery (&a, &b);
if (a < c)
mystery (&c, &a);
mystery (&a, &d);
printf("%d\n", a);
}
Здесь, несмотря на то, что вызов функции того же типа существует, значения любой переменной в программе main()
не изменяются.
Как мы знаем, в коде C нет вызова по ссылке. Итак, мой вопрос заключается в том, что, хотя в обеих программах используется один и тот же тип вызова функции, то почему один меняет местами значения переменной, а другой не может менять местами ??
Во второй программе указатель подкачки означает, что адрес также поменяется местами. Правильно?? Но это не влияет на стоимость. В 1-й программе адрес и указатель меняются местами, а в то же время значения также меняются местами. Но почему ??
Я также хочу знать, где вызов по значению может изменить значение программы main () (с функцией возврата или без нее) ??