指针值

Pointers Values

好吧,指针是一个相当令人困惑的话题,但我很喜欢学习它,尽管有时编程会让我付出代价。无论如何,我正在练习一些问题并卡在了这个问题上。你能解释一下下面代码的输出吗?

#include<iostream>
using namespace std;
void change(int *b,int n)
{
    int i;
    for(i=0;i<n;++i)
        *(b+i)=*(b+i)+5;
}
int main()
{
    int a[]={2,4,6,8,10};
    int i;
    change(a,5);
    for(i=0;i<=4;++i)
        cout<<a[i]<<"\n";

}

在函数中更改 for 循环中的语句给了我一个问题。在左侧的赋值语句中,*(b+i) 正在存储 *(b+1)+5 的值,但是为什么一个值存储另一个值,因为 *(b+i) 每次说第一次迭代都会给出一个值 i is 0 这使得表达式 *(b+0)=*(b+0)+5 。所以这里的 LHS 是 7 而 RHS 是 2,所以 2=7。它不应该给出像 lvalue required 之类的错误吗?

在 C++ 中,*(b+x) 是语法柠檬 (a) for:

b[x]

所以你应该牢记这一点来阅读它。换句话说,你要问的问题最好写成:

b[i] = b[i] + 5;

(a) 显然是语法糖的对立面。之所以如此命名,是因为虽然语法糖更容易阅读,但语法柠檬更难阅读。

除非你的头脑像我一样,因为多年接触 C 而变得如此扭曲,以至于它很容易从容应对这类事情:-)

正如 paxdiablo 所指出的,这基本上只是故意编写的糟糕代码(可能是为了测试或增加您对 C++ 语法的理解)。

首先,change(int *b,int n) 做了什么:

如前所述,*(a+i) 给出 "pointer a, increased by i steps" 处的值。所以 change() 的作用如下:它遍历 i 从 0 到 n 正下方的所有值(for 循环)并执行

*(b+i)=*(b+i)+5;

这后一句的意思是:取"pointer b, increased by i steps"处的值,然后ASSIGN给它(与相等性测试无关!)可以在"pointer b, increased by i steps"处找到的值,增加5 .

简而言之,它的作用是遍历长度为 n 的整数数组 b[](在 C 风格中由其基指针地址 b 寻址),并将所有包含的整数增加 5。

主程序的其余部分只是将更改后的值输出到控制台。

如果你用来学习C++的源代码中的练习题都与此类似,我建议如果可能的话,可以切换到不同的课程。虽然理解语法很重要,但在现代面向对象编程中还有其他概念至少同样重要(例如,正确使用库、继承、代码可维护性……)。

* 运算符的结果始终是 左值 ,因此赋值是合法的。

*的结果是[引用]其操作数指向的对象,而不仅仅是对象的值。

阅读*(b + 0) = *(b + 0) + 5为“位置b + 0处的对象获取b + 0处对象的值加上5

(顺便说一句,第二个 b + 0 被视为值的原因是因为它用在表达式上下文中(作为算术运算符 + 的操作数),其中它value 是必需的,而不是因为它是应用取消引用运算符的结果,如上所述,它会产生左值。这个 "treat as a value" 工件被称为 "lvalue-to-rvalue conversion" 并且在需要时隐式发生。)