TuruDo Ответов: 1

Я не понимаю вывода следующей строки кодов


#include <stdio.h>
void func(int *x, int *y);
int x=1, y=2;

int main(){
  int x=3;
  func(&y, &x);
  printf("x=%2d y=%2d\n", x, y);
  func(&x, &y);
  return 0;
}

void func(int *x, int *y){
  x=y;
  *x=*x-2;
  *y=*y*2;
  printf("x=%2d y=%2d\n", *x, *y);
}


The expected output:

x=10 y=10
x=10 y= 2
x= 8 y= 8

Что я уже пробовал:

Я новичок в языке Си и не понимаю, как указатель и функции работают вместе.
Пожалуйста, помогите мне разобраться!!!

1 Ответов

Рейтинг:
8

OriginalGriff

Я настоятельно рекомендую вам запустить это через отладчик, который покажет вам, что происходит.

Но ... начните с просмотра вашего кода:

int x=1, y=2;          ----- This x is never used.
int main(){
  int x=3;             ----- This version of x hides the outer one;
  func(&y, &x);        ----- passes pointers to "2" and "3" respectively.

В функции имена внешнего мира игнорируются:
void func(int *x, int *y){            --- So x points to "2" and y points to "3"
  x=y;                                --- Now x and y both point to the same place, 
                                          which contains "3"
  *x=*x-2;                            --- So both x and y now point to "3 - 2", or "1"
  *y=*y*2;                            --- And both x and y now point to "1 * 2" or "2"
  printf("x=%2d y=%2d\n", *x, *y);    --- So you get "x = 2, y = 2" printed.
}
Когда вы вернетесь в main и x, и y содержат "2" - потому что func никогда не использовал исходное значение x указатель, который вы передали - он переписал его вместо этого.

Разбейте отладчик и проследите свой код до конца - он станет намного понятнее!
Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.