我写了以下代码:
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);
}
它按预期输出值。我正试图摆脱使用引用,所以我可以更好地理解指针,因为(像大多数人一样)我的指针知识相当有限,所以我试图更好地掌握它们。
另外让我重新解释一下这个问题,我知道为什么它输出那个垃圾值,这是因为它增加了内存地址并在那个位置打印垃圾而不是递增内存地址中包含的值,我想我是问是为什么它会在增量上执行此操作但不添加?它只是这两个命令编译成汇编的方式吗?有没有办法以这种方式增加指针指向的值?
答案 0 :(得分:4)
我很高兴你明白这一行会发生什么:
*num++;
问题是运营商的优先事项。我相信'++'优先于'*'(当然,在这种情况下)。试着写这个,它会按照你想要的方式工作:
(*num)++;
我不知道并且刚学到的一件事是这个上下文中的指针操作优先于+ =。
答案 1 :(得分:4)
这是因为优先级:*num++
被评估为num++
然后解除引用。当您打印下一个值时,它在这种情况下来自无效指针。
如果您使用(*num)++
,您将获得所需的结果。