我有一个main
函数,它包含变量int x
和int y
。我正在调用void
函数task
,指针int *p1
、int *p2
中的x
和y
地址是函数task
的参数。
然后,我尝试增加*p1
和*p2
中包含的值,尝试更改变量x
和y
的值,因为我正在增加变量内部的值。
#include <stdio.h>
void task(int *p1, int *p2)
{
*p1++;
*p2++;
printf("%dn", *p1);
printf("%dn", *p2);
}
int main()
{
int x = 10;
int y = 100;
task(&x, &y);
printf("%dn", y);
printf("%dn", x);
}
但价值观是不变的。是否可以更改变量x
和y
的值?
更改:
*p1++;
*p2++;
至
(*p1)++;
(*p2)++;
在第一种情况下,指针变量p1
和p2
是递增的,而不是它们所指向的值
使用括号可以清楚地表明,要增加的是值,而不是指针本身。
请使用
(*p1)++;
(*p2)++;
现在的顺序不同了。如果将task()
修改为以下,将更清楚地解释
void task(int *p1, int *p2)
{
printf("%p %dn",p1, *p1);
printf("%p %dn",p2, *p2);
*p1++;
*p2++;
printf("%p %dn",p1, *p1);
printf("%p %dn",p2, *p2);
}
尝试检查指针地址&价值,你会发现你错过了什么。
在这里,当您尝试*p1++时,您只是在增加地址。这里首先是p1++,它只是增加了你的地址,然后试图用*p1
从地址中读取值。这就是为什么它不能打印期望的值。
只需添加括号。
这是代码:
#include <stdio.h>
void task(int *p1, int *p2)
{
(*p1)++;
(*p2)++;
printf("%dn", *p1);
printf("%dn", *p2);
}
int main()
{
int x = 10;
int y = 100;
task(&x, &y);
printf("%dn", y);
printf("%dn", x);
return 0;
}