C 指针的增量内容

C 指针的增量内容,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

我试图在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 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。