【问题标题】:C: updating memory address contents using pointers with ++ / -- [duplicate]C:使用带有 ++ / -- [重复] 的指针更新内存地址内容
【发布时间】:2013-01-06 21:36:55
【问题描述】:

我在想,为什么会这样:

*some_var++;

不做同样的事情:

*some_var = *some_var + 1;

...是因为在第二个示例中, 解引用运算符被用于两个不同的目的吗?

*some_var = *some_var + 1;

也就是说:*some_var 的第一个实例正在设置 &some_var 的内容,而 *some_var 的第二个实例正在调用&some_var 的当前内容? ...这是 C 不能用以下语句做出的区别:*some_var++;?

此外,确实:

*some_var++;

做任何事,如果是,怎么办?!

感谢您的任何意见......也许是一件微不足道的事情,但我还是很好奇。

【问题讨论】:

  • 谢谢,我的问题前搜索没有发现这一点。

标签: c pointers memory updating


【解决方案1】:
*some_var++;

等价于

*(some_var++);

并不等同于:

(*some_var)++;

++ 后缀运算符的优先级高于* 一元运算符。

顺便说一句,由于您没有在语句中使用* 运算符的值,所以*some_var++; 语句也等价于some_var++;(假设some_var 不是指向volatile 的指针目的)。

【讨论】:

  • +1 如果您不想记住运算符的优先顺序,请使用括号。跟随你的非专家会很感激。在某些情况下,GCC 甚至会建议它。
  • @JonathonReinhart 我一般同意这一点,但*ptr++ 是任何体面的 C 程序员都应该能够理解的形式。
  • @ouah:当然!谢谢。
【解决方案2】:

请参阅以下示例:

ex: 1

int main()
{
  char *ptr = "stackoverflow";
  *ptr++;
  printf ("%s\n", ptr);//this will print "tackoverflow" i.e pointr is incremented.
  return 0;
}

ex:2

int main()
{
   char *ptr = "stackoverflow";
   *ptr = *ptr + 1;// here you are trying to assing incremented content to *ptr, but this will give you error because string literal "stackoverflow" is stored in the read only memory so you can't modify .
}

【讨论】:

    猜你喜欢
    • 2019-08-19
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2013-12-22
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多