我正在尝试增加指针。我确信它与i+=1
类似,但我得到了地址。
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int i = 42;
int *a = &i;
*a++;
cout << *a;
cin.get();
return 0;
}
有人可以解释原因吗?
答案 0 :(得分:9)
++
的运算符优先级高于指针解除引用运算符*
。
所以*a++
做的是在递增指针值之前返回i
的值(*a
的旧值)。
在评估该表达式之后,a
现在指向i
地址以外的其他内容,后续*a
的行为未定义
如果您想通过指针递增i
,请使用(*a)++;
答案 1 :(得分:3)
如果您希望输出为&#34; 43&#34;,则必须将*a++;
更改为(*a)++;
。
但除了测试和学习之外,像你这样的代码更像是一个&#34; C的东西&#34;而不是&#34; C ++的事情&#34;。 C ++提供了另一种引用数据并在其上进行操作的方法,通过语言称之为“引用”。
int i=42;
int &a=i; // ‘a’ is a reference to ‘i’
a++;
assert(i==43); // Assertion will not fail
引用对于将参数传递给函数特别有用,而不存在使用null或置换指针的风险。
答案 2 :(得分:2)
&#34;我得到了地址&#34;意思?
您检查了操作顺序吗?
http://en.cppreference.com/w/cpp/language/operator_precedence
++ - postfix的优先级高于* -dereference - 因此:
*a++;
真的是:
*(a++);
而不是:
(*a)++;
......你可能意味着。恕我直言,为什么我总是建议在括号太多而不是太少的情况下犯错误。明确你的意思:))
答案 3 :(得分:2)
您使用过*a++;
由于增量运算符++
的优先级高于指针*
,实际发生的是指针地址递增。所以new * a没有定义的值,因此它会给出一个未定义的值
*a++;
相当于a++;
要解决此问题,您可以使用括号(*a)++;
或仅使用预增量运算符++*a;
答案 4 :(得分:0)
你的代码工作正常,直到你到达 p>
*a = *(a+1);
如您所知,C ++编译器会将此行代码分解为
*(a)++;
也就是说,它首先会增加 a 的地址值,然后将值分配给 * a 。但如果你这样做,
{{1}}
然后你会得到正确的输出,即43。