Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针值_C++_Pointers - Fatal编程技术网

C++ 指针值

C++ 指针值,c++,pointers,C++,Pointers,好的指针是一个相当令人困惑的话题,但我很喜欢学习它,尽管有时编程会让我付出代价。不管怎样,我在练习一些问题,却被这个问题卡住了。你能解释一下下面代码的输出吗 #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,1

好的指针是一个相当令人困惑的话题,但我很喜欢学习它,尽管有时编程会让我付出代价。不管怎样,我在练习一些问题,却被这个问题卡住了。你能解释一下下面代码的输出吗

#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";

}
#包括
使用名称空间std;
无效更改(整数*b,整数n)
{
int i;
在C++中,(i=0;i,<代码> *(b+x)< /COD>是句法柠檬(a):

所以你应该记住这一点。换句话说,你要问的问题最好写为:

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

(a) 显然,与句法糖相反。之所以这样命名是因为,虽然句法糖是一个更容易阅读的等价物,但句法柠檬更难阅读

除非你的思维和我的一样,在C的曝光中扭曲,所以它很容易地被这种东西所跨越:-----)/< P> < C++ >,<代码> *(B+X)< /> >是句法柠檬(A):

所以你应该记住这一点。换句话说,你要问的问题最好写为:

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

(a) 显然,与句法糖相反。之所以这样命名是因为,虽然句法糖是一个更容易阅读的等价物,但句法柠檬更难阅读


除非你的思维和我的一样,在C的曝光中扭曲,所以它很容易地把这类东西跨过:-/P>> P.PaxDabLo指出,这基本上只是故意写得很差的代码(可能是测试或增加你对C++语法的理解)。 首先,更改(int*b,int n)的作用是:

如前所述,
*(a+i)
给出了“指针a,增加i步”处的值。因此change()所做的是:它将i的所有值从0循环到刚好低于n(for loop)并执行

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

后一个语句的意思是:取“指针b,增加i步”处的值,然后将“指针b,增加i步”处的值增加5指定给它(与相等性测试无关!)

简言之,它所做的是在长度为n的int数组b[]上循环(通过其基指针地址b以C样式寻址),并将所有包含的整数增加5

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


如果你使用的C++学习源的实际问题与此类似,我建议如果可能的话,切换到另一个过程。在理解语法很重要的同时,还有其他的概念在现代面向对象编程中至少同样重要。(比如,正确使用库、继承、代码可维护性……)

< P>作为PAXDIABLO指出,这基本上只是有意编写的代码(可能测试或增加您对C++语法的理解)。 首先,更改(int*b,int n)的作用是:

如前所述,
*(a+i)
给出了“指针a,增加i步”处的值。因此change()所做的是:它将i的所有值从0循环到刚好低于n(for loop)并执行

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

后一个语句的意思是:取“指针b,增加i步”处的值,然后将“指针b,增加i步”处的值增加5指定给它(与相等性测试无关!)

简言之,它所做的是在长度为n的int数组b[]上循环(通过其基指针地址b以C样式寻址),并将所有包含的整数增加5

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


如果你使用的C++学习源的实际问题与此类似,我建议如果可能的话,切换到另一个过程。在理解语法很重要的同时,还有其他的概念在现代面向对象编程中至少同样重要。(例如,正确使用库、继承、代码可维护性等)。

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

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

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


(另一方面,第二个
b+0
被视为值的原因是因为它在表达式上下文中使用(作为算术运算符
+
的操作数),其中需要它的值,而不是因为它是应用解引用运算符的结果,如上所述,解引用运算符会导致左值。这“视为值”工件被称为“左值到右值的转换”,并在需要时隐式发生。)

操作符的结果始终是左值,因此赋值是合法的

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

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


(另一方面,第二个
b+0
被视为值的原因是因为它在表达式上下文中使用(作为算术运算符
+
的操作数),其中需要它的值,而不是因为它是应用解引用运算符的结果,如上所述,解引用运算符会导致左值。这“视为值”工件称为“左值到右值的转换”,在需要时隐式发生。)

Side:此问题右侧相关列表中的顶部链接可能具有教育意义。您的代码调用未定义的行为。循环的最后一次迭代从内存中写入和读取一个超出您声明大小的元素。Side:此问题右侧相关列表中的顶部链接可能具有教育意义。而您的c