指针在整数数组上移动时如何工作
how does pointer works when moving on array of integers
我有一个关于以下代码的问题。 第 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
我希望这有所帮助。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?