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 и "отладчика" должен дать вам необходимую информацию.
Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.