提问人:Aevo 提问时间:6/12/2023 更新时间:6/12/2023 访问量:60
指针值差异不符合预期
Pointer value difference not as expected
问:
为什么以下代码将 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?
答:
2赞
Ted Lyngmo
6/12/2023
#1
这会将 的结果赋值给 ,所以在*a + *b
*a
*a = *a + *b; // 4 + 5
然后是 ,所以*a
9
*b = *a - *b;
使它 ,即 。*b = 9 - 5
4
该问题与指针无关。如果你这样做,你会遇到同样的问题:
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
另请注意,该程序具有未定义的行为,因为已声明返回 ,但它不会返回任何内容。fun
int
评论
0赞
Aevo
6/12/2023
谢谢,实际上我没有共享 main() 代码,它应该在那里打印 a 和 b 的值。
0赞
Ted Lyngmo
6/12/2023
别客气!我不确定我是否理解你对 .您在问题中包含了一个,这很好。不过,关于以下说明:而不是 ,使其具有最大的可移植性。main
main
main
void main()
int main(void)
0赞
Aevo
6/12/2023
哦,对不起,没关系,以为我没有包括主要。你能告诉我为什么这个函数有未定义的行为吗?
0赞
Ted Lyngmo
6/12/2023
它具有未定义的行为,因为您已声明返回 ,但它没有任何作用。这可能会导致您的程序表现得非常奇怪。它可能会崩溃,不打印任何值,打印错误的值等。fun
int
return
1赞
Aevo
6/12/2023
哦,好的,谢谢你让我知道
1赞
Stefan
6/12/2023
#2
如果 和 :a=4
b=5
int fun(int *a, int *b){
*a = *a+*b;
*b = *a-*b;
}
此函数将:
- [
a=4
和 ]:第一行设置为 9 = (4+5)b=5
a
- [
a=9
和 ]:第二行设置为 4 = (9-5)b=5
b
请尝试以下操作:
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 )
该函数具有返回类型,但不返回任何内容。fun
int
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;
}
评论
*a
*a = *a + *b;