В C у меня возникли проблемы с отслеживанием кода и я не уверен, как вычисляется значение?

#c #function #pointers

#c #функция #указатели

Вопрос:

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

Я отслеживаю код и понимаю все части, кроме 2. Я опубликовал эти 2 части ниже. Я буду очень рад, если кто-нибудь сможет мне помочь.

  #include <stdio.h>
int function1(int *m, int n)
{
    *m = *m   n;
    return(*m);
}
int function2(int n, int *m)
{
    n = *m   2;
    return(n);
}
int main()
{
    int x = 1, y = 3;
    int *xptr = amp;x,*yptr = amp;y;      
    x = 1; y = 3;
    y = function1(xptr,x);
    printf("x = %d, Y = %dn",x,y);//x=2 but why? shouldn't it be x=1? y=2          
    x = 1; y = 3;
    x = function1(yptr,function2(2,yptr));
    printf("x = %d, y = %dn",x,y);//x=8 y=8 but why? shouldn't y=3?        
return 0;
}
  

Комментарии:

1. Вы передаете указатели на функцию, которая изменяет указатель.

2. Вы изучали указатели?

Ответ №1:

Итак, внутри function1:

 int function1(int *m, int n) {
    *m = *m   n;
    return(*m);
}                 /* 
...                */
y = function1(xptr,x);
  
  • n содержит копию значения x ,
  • m содержит копию значения xptr , которое является адресом x .
  • *m относится к содержимому адреса, хранящегося в m
  • *m = *m n

Это ‘присвоить содержимому адреса x : содержимое адреса x плюс значение x ‘.

Содержимое адреса x (он же его значение) равно 1. Итак, мы присваиваем 1 1 содержимому адреса, содержащего значение x .

Ответ №2:

В первом printf , x == 2 потому что при вызове function1 в первый раз *m указывается указатель на x , поэтому вы присваиваете местоположение, указанное m (то есть местоположение x ), *m n == x x == 1 1 == 2 .

Во втором printf , y == 8 потому что в function2 вы возвращаете его значение, увеличенное на 2 (so 3 2 == 5 ), но без обновления y , поэтому в function1 вы суммируете результирующее значение function2 со старым значением y ( 3 5 == 8 ) . function1 верните также это значение, так что также x == 8 .