指针递增打印垃圾值?

6
我写了以下代码:
void incrementNumber(int *num)
{
    *num++;
    printf("%i\n", *num);
}

int main()
{
    int i = 3;
    printf("%i\n", i);

    int *ptr = &i;

    incrementNumber(&i);
    printf("%i\n", i);

    getchar();
    getchar();

    return 0;
}

每当我在递增数字时输出num,它只打印出垃圾值。但是,如果我将代码更改为以下内容:
void incrementNumber(int *num)
{
    *num += 1;
    printf("%i\n", *num);
}

它按预期输出值。我正在尽量避免使用引用,以便更好地理解指针,因为(像大多数人一样)我对指针的了解相当有限,所以我正努力掌握它们。同时,让我重新表述问题,我知道为什么会输出垃圾值,那是因为它在增加内存地址并打印该位置的垃圾值,而不是增加内存地址中包含的值,我猜我想问的是,为什么它会在增量上执行此操作,但不是在加法上执行?这只是两个命令编译成汇编的方式吗?是否有一种方法可以以这种方式递增指针所指向的值?

4
优先级:*(num++)(*num)++ 之间有区别。由于您编写的代码等同于第一个,但可能意图使用第二个,因此会得到垃圾值。想想原型 strcpy() 循环:while ((*dst++ = *src++) != '\0') ; — 它是做什么的? - Jonathan Leffler
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Trevor Hart
这行代码:“num ++;”存在优先级问题。建议使用:“(num)++;”。 - user3629249
发布的代码无法干净地编译。编译器会发出警告消息:“warning: unused variable 'ptr' [-Wunused-variable]”。 - user3629249
2个回答

4

很高兴你理解这行代码的作用:

*num++;

问题在于运算符的优先级。在这种情况下,我相信'++'的优先级高于'*'。尝试编写以下代码,它会按照您的预期工作:
(*num)++;

我不知道的一件事,现在才学到,就是在这种情况下指针操作比 += 运算符具有更高的优先级。


4
那是因为优先级的原因:*num++被解释为num++,然后再取值。在这种情况下,当您打印下一个值时,它来自一个无效的指针。
如果使用(*num)++,您将得到所需的结果。

没问题!这很合理,我猜仅仅说“*num++”是有歧义的,所以这样做非常明智。干杯! - Trevor Hart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接