增加指针不起作用

时间:2015-12-29 13:52:36

标签: c++ pointers

我正在尝试增加指针。我确信它与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;
}

有人可以解释原因吗?

5 个答案:

答案 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)

你的代码工作正常,直到你到达

*a = *(a+1);

如您所知,C ++编译器会将此行代码分解为

*(a)++;

也就是说,它首先会增加 a 的地址值,然后将值分配给 * a 。但如果你这样做,

{{1}}

然后你会得到正确的输出,即43。

输出 - Error - Umbraco 4 backoffice