c: 在函数中使用指针作为输入时,使用 *pointer++ 递增指针值不起作用
c: when using a pointer as input in a function incrementing the pointers value by using *pointer++ doesn't work
当我学习 C(我对它很陌生)时,我一直在玩弄指针。在这里你可以看到我的代码:
#include <stdio.h>
void change(int *i)
{
*i += 1;
}
int main()
{
int num = 3;
printf("%d\n", num);
change(&num);
printf("%d\n", num);
return 0;
}
我的目标是替换增加 num 值而不像这样重新分配它:
num = change(num);
这就是我使用 &
传递 num
的内存位置的原因:因此它可以用作指针。在此版本之前,代码中的所有内容都是相同的。唯一不同的是我说 *i++;
而不是 *i += 1;
现在我的问题是为什么我不能说 *i++
?
Now my question is why i can't say *i++
由于运算符优先级,*i++
与 *(i++)
相同。
*(i++);
相当于:
int* temp = i; // Store the old pointer in a temporary variable.
i++; // Increment the pointer
*temp; // Dereference the old pointer value, effectively a noop.
那不是你想要的。您需要使用 (*i)++
或 ++(*i)
。这些将首先取消引用指针,然后增加指针指向的对象的值。
这是由于 operator precedence。
您可以看到 "postfix increment" 处于优先级 1,"Indirection (dereference)" 处于优先级 2,并且优先级 1 先发生。所以你需要使用方括号来让取消引用首先发生:(*i)++
.
不同之处在于 (*i)++
表示找到 i
指向的内存并递增它(你想要的)。 *(i++)
表示增加 i
本身(因此它指向 next 内存地址),并取消引用它;这可能是一个空操作,而不是你想要的。
当我学习 C(我对它很陌生)时,我一直在玩弄指针。在这里你可以看到我的代码:
#include <stdio.h>
void change(int *i)
{
*i += 1;
}
int main()
{
int num = 3;
printf("%d\n", num);
change(&num);
printf("%d\n", num);
return 0;
}
我的目标是替换增加 num 值而不像这样重新分配它:
num = change(num);
这就是我使用 &
传递 num
的内存位置的原因:因此它可以用作指针。在此版本之前,代码中的所有内容都是相同的。唯一不同的是我说 *i++;
而不是 *i += 1;
现在我的问题是为什么我不能说 *i++
?
Now my question is why i can't say *i++
由于运算符优先级,*i++
与 *(i++)
相同。
*(i++);
相当于:
int* temp = i; // Store the old pointer in a temporary variable.
i++; // Increment the pointer
*temp; // Dereference the old pointer value, effectively a noop.
那不是你想要的。您需要使用 (*i)++
或 ++(*i)
。这些将首先取消引用指针,然后增加指针指向的对象的值。
这是由于 operator precedence。
您可以看到 "postfix increment" 处于优先级 1,"Indirection (dereference)" 处于优先级 2,并且优先级 1 先发生。所以你需要使用方括号来让取消引用首先发生:(*i)++
.
不同之处在于 (*i)++
表示找到 i
指向的内存并递增它(你想要的)。 *(i++)
表示增加 i
本身(因此它指向 next 内存地址),并取消引用它;这可能是一个空操作,而不是你想要的。