在整数数组上移动时指针如何工作

时间:2013-11-19 10:33:53

标签: c++ c arrays pointers int

我对以下代码有疑问。第1行可以重写为*(p ++)= *(p ++)+ 123;
右手边是6 + 123 = 129我明白了。但它如何分配给左手边?
什么*(p ++)作为左手边?谢谢!

    int a[] = {6,7,8,9,10};
    int *p = a;
    *(p++)+=123; //array 129 7 8 9 10     line 1  
    cout<<*p<<endl;// 7

    *(++p)+=123;// array 129 7 131 9 10   line 2
    cout<<*p<<endl;// 131

3 个答案:

答案 0 :(得分:4)

  

第1行可以重写为*(p++) = *(p++)+123;

不,不能;这将增加p两次。它可以(大致)重写为

int & r = *p++;
r = r + 123;

而第2行更像是

++p;
*p = *p + 123;
  

但它如何分配给左手边?什么*(p ++)作为左手边?

p++评估为暂时保留p的旧值。 *(p++)取消引用,以指定可指定的左值引用用于指向的对象p+=修改该对象。

(注意:我正在写关于C ++的文章,虽然你似乎在问两种不同的语言。对于C来说答案可能非常相似,尽管一些标准术语可能有所不同。将来,请决定你使用哪种语言“问一下。”

答案 1 :(得分:1)

这只是非常简短的代码。这是一个更长的版本:

int a[] = {6,7,8,9,10};
int *p = a;
*p += 123; //array 129 7 8 9 10     line 1  
p++; // p points to a + 1
cout << *p << endl;// 7

++p; // p points to p + 1 = a + 2
*p += 123;// array 129 7 131 9 10   line 2
cout << *p << endl;// 131

基本上:p++表示返回p并在之后递增,而++p表示先递增并返回结果。

答案 2 :(得分:1)

执行

int a[] = {6,7,8,9,10};
int *p = a;

你的记忆中有这样的东西

  -------------------- 
 | 6 | 7 | 8 | 9 | 10 |
  -------------------- 
   |
   a,p 

然后你到达这一行:*(p++)+=123;
这里增量运算符是一个后增量,意味着你将使用当前值p并在之后增加。
所以我们可以把这个陈述写成两个陈述,第一个是:
(*p) +=123;
所以我们在记忆中得到这个

  ----------------------
 | 129 | 7 | 8 | 9 | 10 |
  ---------------------- 
   |
   a,p 

并且第二个语句正在递增p
p++;
你在记忆中得到这个

  ----------------------
 | 129 | 7 | 8 | 9 | 10 |
  ---------------------- 
   |     |
   a     p

现在第2行:*(++p)+=123; 这里增量首先发生,然后你取消引用指针(用它的新值)并分配它。 所以这个陈述可以再写成两个陈述,第一个是:
++p;
你在记忆中得到这个

  ----------------------
 | 129 | 7 | 8 | 9 | 10 |
  ---------------------- 
   |         |
   a         p

,第二个陈述是 (*p) += 123; // p is pointing at 8, 你在记忆中得到这个

  ------------------------
 | 129 | 7 | 131 | 9 | 10 |
  ------------------------ 
   |         |
   a         p

我希望这会有所帮助。