无法理解为什么a [1]的值不等于10
void main()
{
int a[]={2,1};
int *ptr=a;
*ptr++=10; //trying to update a[1]=10
printf("%d",*ptr);
}
有人可以解释一下吗?
答案 0 :(得分:5)
让我们来看看你的代码吧:
int main() {
int a[]={2,1};
int *ptr=a;
// Validation
assert(ptr == &a[0]);
// Let's now do what *ptr++ = 10 actually does:
*ptr = 10;
ptr = ptr + 1;
// Validation
assert(ptr == &a[1]);
// Printing. Note that we are printing a[1], not a[0].
printf("%d",*ptr);
}
从cppreference阅读引用可能也会有所帮助。他们正在讨论后缀增量(ptr++
)和前缀增量(++ptr
)之间的区别。
运算符的 postfix 版本的返回结果是原始操作数,副作用是在返回此结果后操作数递增/递减。
运算符的前缀版本的返回结果是递增/递减的操作数。
听起来你想要使用前缀增量,而不是后缀增量。
答案 1 :(得分:3)
由于++
的优先级高于一元*
,因此*p++
将被归为*(p++)
,这意味着:取消引用旧的ptr
并增加{ {1}} ptr
(只要使用原始值,增量就可以随时发生)。 1
会将*ptr++=10;
更新为a[0]
。
答案 2 :(得分:0)
您的代码被注释为执行流程:
int main(void)
{
int a[]={2,1}; //sets a[0]=2, a[1]=1
int *ptr=a; //sets *ptr == address of a, or a[0]
*ptr++=10; //sets a[0] = 10 (a[1] unchanged)
printf("%d",*ptr);
getchar();
}
*ptr++=10;
将值10分配给[0]的地址,然后在分配后增加* ptr 。