C 指针的增量内容
我试图在C中增加一个值并返回旧值,我使用一个指针来实现这一点。问题是,即使我使用指针,新值仍然是0C 指针的增量内容,c,pointers,operators,C,Pointers,Operators,我试图在C中增加一个值并返回旧值,我使用一个指针来实现这一点。问题是,即使我使用指针,新值仍然是0 #include <stdio.h> #include <stdlib.h> int increment (int *mem) { int tmp; tmp = *mem; *mem++; return tmp; } int main () { int a = 0; printf("The old value of a i
#include <stdio.h>
#include <stdlib.h>
int increment (int *mem) {
int tmp;
tmp = *mem;
*mem++;
return tmp;
}
int main () {
int a = 0;
printf("The old value of a is \t %d", increment(&a));
printf("The new value of a is \t %d", a);
}
现在,当我运行这个方法时,我得到了与a相同的值,即0;我希望第二次打印中有1个。我不知道我做错了什么。改变这个
*mem++;
对此
(*mem)++;
问题在于运营商的优先权。你可能想了解一下
那么,你的代码是做什么的?它增加指针的值,因为首先激活了++运算符,然后*被激活,没有实际效果
因此,您的代码会调用,因为您访问并最终写入无效的内存位置,因为指针在写入值之前会递增。更改此设置
*mem++;
对此
(*mem)++;
问题在于运营商的优先权。你可能想了解一下
那么,你的代码是做什么的?它增加指针的值,因为首先激活了++运算符,然后*被激活,没有实际效果
因此,您的代码会调用,因为您访问并最终写入无效的内存位置,因为指针在写入值之前会递增。可能您遗漏了一些括号
#include <stdio.h>
#include <stdlib.h>
int increment (int *mem) {
int tmp;
tmp = *mem;
(*mem)++; // problem was here.
return tmp;
}
int main (){
int a = 0;
printf("The old value of a is \t %d", increment(&a));
printf("The new value of a is \t %d", a);
}
也许你漏掉了一些括号
#include <stdio.h>
#include <stdlib.h>
int increment (int *mem) {
int tmp;
tmp = *mem;
(*mem)++; // problem was here.
return tmp;
}
int main (){
int a = 0;
printf("The old value of a is \t %d", increment(&a));
printf("The new value of a is \t %d", a);
}
除了其他人发布的关于运算符优先级的内容外,如果您传入一个指向要递增的int的指针,则没有理由通过tmp返回int的副本。您将可以在函数外部访问mem中的值
#include <stdio.h>
#include <stdlib.h>
void increment (int *mem) {
(*mem)++;
}
int main () {
int a = 0;
printf("The old value of a is \t %d", a);
increment(&a);
printf("The new value of a is \t %d", a);
}
除了其他人发布的关于运算符优先级的内容外,如果您传入一个指向要递增的int的指针,则没有理由通过tmp返回int的副本。您将可以在函数外部访问mem中的值
#include <stdio.h>
#include <stdlib.h>
void increment (int *mem) {
(*mem)++;
}
int main () {
int a = 0;
printf("The old value of a is \t %d", a);
increment(&a);
printf("The new value of a is \t %d", a);
}
尝试*mem++,然后阅读有关运算符优先级的内容。您确实应该学习如何使用调试器,在编译器中启用所有警告和调试信息,并阅读有关C语法的更多信息。不要写一些你不精通的语法,所以尽可能多地添加括号。我从20世纪80年代开始就用C语言编写代码,我从来没有编写过*mem++,因为我发现它太难读了,所以我要么编写*mem++,要么编写*mem++,甚至编写了mem[0]+。。。。,即使它有一些已定义的含义try*mem++那么请阅读关于运算符的先例您真的应该学习如何使用调试器,在编译器中启用所有警告和调试信息,并阅读更多关于C语法的内容。不要写一些你不掌握的语法,所以尽可能多地添加括号。我从20世纪80年代开始就用C语言编写代码,我从来没有编写过*mem++,因为我发现它太难读了,所以我要么编写*mem++,要么编写*mem++,甚至编写mem[0]+..,即使它有一些定义的含义,意味着要使用C版本。我把它删掉了。没有注意到你的link.IMO,你应该提到OP的代码调用UB.Good idea@CoolGuy,因为她修改指针的值和访问它的权限,对吗?这就是你的意思还是你有别的想法?没关系,是的。OP的代码写入了一个无效的内存位置,因为指针在写入值之前是递增的。如果你想在答案中做些其他的改变,请告诉我。我的意思是使用C版本。我把它删掉了。没有注意到你的link.IMO,你应该提到OP的代码调用UB.Good idea@CoolGuy,因为她修改指针的值和访问它的权限,对吗?这就是你的意思还是你有别的想法?没关系,是的。OP的代码写入了一个无效的内存位置,因为指针在写入值之前是递增的。如果你想在答案中做些其他的改变,请告诉我。括号应该用作复数。因为我是希腊人,我不得不告诉你顺便说一句,完整的代码是+1。复数应该用括号。因为我是希腊人,我不得不告诉你对了,完整的代码是+1。