指针值差异不符合预期

Pointer value difference not as expected

提问人:Aevo 提问时间:6/12/2023 更新时间:6/12/2023 访问量:60

问:

为什么以下代码将 4-5 显示为 4 而不是 -1

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int fun(int *a, int *b){
  *a = *a+*b;
  *b = *a-*b;
}

void main(){
  int a=4;
  int b=5;
  int *p=&a, *q=&b;
  fun(p,q);
  printf("%d\t%d",a,b);
}

总和是 9(正如预期的那样),但为什么差异是 4?

C 指针 按引用传递 差异

评论

1赞 Matt 6/12/2023
after 的价值是什么?*a*a = *a + *b;

答:

2赞 Ted Lyngmo 6/12/2023 #1

这会将 的结果赋值给 ,所以在*a + *b*a

*a = *a + *b; // 4 + 5

然后是 ,所以*a9

*b = *a - *b;

使它 ,即 。*b = 9 - 54

该问题与指针无关。如果你这样做,你会遇到同样的问题:

int a = 4;
int b = 5;
a = a + b; // assign the result of 4 + 5 (9) to a
b = a - b; // assign the result of 9 - 5 (4) to b

另请注意,该程序具有未定义的行为,因为已声明返回 ,但它不会返回任何内容。funint

评论

0赞 Aevo 6/12/2023
谢谢,实际上我没有共享 main() 代码,它应该在那里打印 a 和 b 的值。
0赞 Ted Lyngmo 6/12/2023
别客气!我不确定我是否理解你对 .您在问题中包含了一个,这很好。不过,关于以下说明:而不是 ,使其具有最大的可移植性。mainmainmainvoid main()int main(void)
0赞 Aevo 6/12/2023
哦,对不起,没关系,以为我没有包括主要。你能告诉我为什么这个函数有未定义的行为吗?
0赞 Ted Lyngmo 6/12/2023
它具有未定义的行为,因为您已声明返回 ,但它没有任何作用。这可能会导致您的程序表现得非常奇怪。它可能会崩溃,不打印任何值,打印错误的值等。funintreturn
1赞 Aevo 6/12/2023
哦,好的,谢谢你让我知道
1赞 Stefan 6/12/2023 #2

如果 和 :a=4b=5

int fun(int *a, int *b){
   *a = *a+*b;
   *b = *a-*b;
}

此函数将:

  1. [a=4和 ]:第一行设置为 9 = (4+5)b=5a
  2. [a=9和 ]:第二行设置为 4 = (9-5)b=5b

请尝试以下操作:

void fun(int *a, int *b){
   int temp = *a+*b;
   *b = *a-*b;
   *a = temp;
}
2赞 Vlad from Moscow 6/12/2023 #3

对于初学者来说,所有这些标题

#include <string.h>
#include <math.h>
#include <stdlib.h>

是多余的,因为程序中既不使用标头中的声明。

此外,根据 C 标准,没有参数的函数应声明如下main

int main( void )

该函数具有返回类型,但不返回任何内容。funint

int fun(int *a, int *b){

它应该被声明为

void fun(int *a, int *b){

至于你的问题,那么在函数的第一个语句之后

*a = *a+*b;

对象已更改,并在下一个语句中*a

*b = *a-*b;

已经使用了对象的新值。

相反,你可以写例如

void fun( int *a, int *b )
{
    int tmp = *a;

    *a = *a + *b;
    *b = tmp - *b;
}