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

how does pointer works when moving on array of integers

本文关键字:何工作 工作 整数 数组 移动 指针      更新时间:2023-10-16

我有一个关于以下代码的问题。 第 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

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

不,它不能;那会p增加两倍。它可以(大约(重写为

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

而2号线更像

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

但是它如何分配给左侧? *(p++( 作为左侧工作是什么?

p++计算结果为临时持有旧值 p*(p++)取消引用,以给出一个可分配的左值,引用p用于指向的对象。 +=修改该对象。

(注意:我写的是C++,尽管你似乎在问两种不同的语言。对于 C 语言,答案可能非常相似,尽管某些标准术语可能有所不同。将来,请决定您要询问哪种语言。

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

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表示先递增并返回结果。

执行后

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

我希望这有所帮助。