C++ 递增指针不工作
我正试图增加指针。我确信它类似于do I+=1,但我得到了地址C++ 递增指针不工作,c++,pointers,C++,Pointers,我正试图增加指针。我确信它类似于do 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; } 有人能解释为什么吗?++的运算符优先级高于指针解引用运算符* 因此,*a
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int i = 42;
int *a = &i;
*a++;
cout << *a;
cin.get();
return 0;
}
有人能解释为什么吗?++的运算符优先级高于指针解引用运算符*
因此,*a++所做的是在递增指针值之前,返回i的值和原来的*a的值
在对该表达式求值之后,a现在指向i的地址以外的其他内容,并且后续的*a的行为未定义
如果要通过指针增加i,则使用*a++ ++的运算符优先级高于指针解引用运算符*
因此,*a++所做的是在递增指针值之前,返回i的值和原来的*a的值
在对该表达式求值之后,a现在指向i的地址以外的其他内容,并且后续的*a的行为未定义
如果要通过指针增加i,则使用*a++ 如果希望输出为43,则必须更改*a++;到*a++ 除了测试和学习之外,像你这样的代码比C++更重要。C++提供了一种引用数据并在其上运行的另一种方法,通过语言称为“引用”。
int i=42;
int &a=i; // ‘a’ is a reference to ‘i’
a++;
assert(i==43); // Assertion will not fail
引用对于向函数传递参数特别有用,而不会有空指针或移位指针的风险。如果希望输出为43,则必须更改*a++;到*a++ 除了测试和学习之外,像你这样的代码比C++更重要。C++提供了一种引用数据并在其上运行的另一种方法,通过语言称为“引用”。
int i=42;
int &a=i; // ‘a’ is a reference to ‘i’
a++;
assert(i==43); // Assertion will not fail
引用在向函数传递参数时特别有用,而不会有空指针或替换指针的风险。在到达代码行之前,代码工作正常
*a++;
正如你所知道的,C++编译器会把这个代码分解成
*a = *(a+1);
也就是说,它将首先递增a的地址值,然后将该值分配给*a。但如果你这样做
*(a)++;
然后您将得到正确的输出,即43
对于输出-您的代码可以正常工作,直到到达行
*a++;
正如你所知道的,C++编译器会把这个代码分解成
*a = *(a+1);
也就是说,它将首先递增a的地址值,然后将该值分配给*a。但如果你这样做
*(a)++;
然后您将得到正确的输出,即43
对于输出-我获得地址意味着什么 你查过操作规程了吗 ++-后缀的优先级高于*-取消引用-因此:
*a++;
事实上:
*(a++);
而不是:
(*a)++;
。。。正如你可能的意思。这就是为什么我总是建议错误的括号太多而不是太少。明确你的意思:我得到的地址是什么意思 你查过操作规程了吗 ++-后缀的优先级高于*-取消引用-因此:
*a++;
事实上:
*(a++);
而不是:
(*a)++;
。。。正如你可能的意思。这就是为什么我总是建议错误的括号太多而不是太少。明确你的意思:你使用了*a++
由于增量运算符++的优先级高于指针*,实际发生的情况是指针地址正在递增。因此,新的*a没有定义的值,因此它将给出一个未定义的值
*a++;是a++的等价物
要解决这个问题,可以使用括号*a++;或者简单地使用预增量运算符+++*a 您使用了*a++
由于增量运算符++的优先级高于指针*,实际发生的情况是指针地址正在递增。因此,新的*a没有定义的值,因此它将给出一个未定义的值
*a++;是a++的等价物
要解决这个问题,可以使用括号*a++;或者简单地使用预增量运算符+++*a 你得不到地址,你得到的是一个不确定的数字,恰巧是非常大的。你得不到地址,你得到的是一个不确定的数字,恰巧是非常大的。回答很好,加上一个,尽管我尊重地不同意你的上一句话。对我来说,包含括号表示有意偏离正常操作员行为。在这个网站上有很多受人尊敬的程序员持相反的观点。好答案加上一个,尽管我尊重地不同意你的上一句话。对我来说,包含括号表示有意偏离正常操作员行为。然而,这个网站上有很多备受尊敬的程序员持相反的观点。