#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
.