我是一个C++新手,我很确定这是一个愚蠢的问题,但我就是不太明白为什么以下代码会出现(不会出现)错误:
#include <iostream>
using namespace std;
int main()
{
int a,*test;
*test = &a; // this error is clear to me, since an address cannot be
// asigned to an integer
*(test = &a); // this works, which is also clear
return 0;
}
但为什么这也能行得通呢?
#include <iostream>
using namespace std;
int main()
{
int a, *test= &a; // Why no error here?, is this to be read as:
// *(test=&a),too? If this is the case, why is the
// priority of * here lower than in the code above?
return 0;
}
发布于 2017-06-17 16:48:59
您混淆了*的两种用法。
在您的第一个示例中,您使用它来取消引用一个指针。在第二个示例中,您将使用它来声明一个“int指针”。
所以,当你在一个声明中使用*时,它表示你声明了一个指针。
发布于 2017-06-17 17:45:13
您刚刚碰到了两个可怕的语言设计点:将声明压缩到一行中,以及将*
符号重用于不相关的目的。在本例中,*
用于声明指针(当它用作类型签名int a,*test;
的一部分时)和引用指针(当它用作语句*test = &a;
时)。最好的做法是一次声明一个变量,使用自动类型推导而不是类型复制,并使用专用的addressof
方法:
#include <memory> // for std::addressof
int a{};
auto const p_a{::std::addressof(a)};
发布于 2017-06-18 08:49:09
这里有一个细微的区别。
当您声明int,*test时,您是在说“将a声明为整数,并将test声明为指向整数的指针,但两者均未初始化。”
在第一个示例中,在声明之后将*test设置为&a。翻译为:“将测试指向的整数(内存地址)设置为的地址。”这几乎肯定会崩溃,因为test没有初始化,所以它要么是一个空指针,要么是胡言乱语。
在另一个示例中,int,*test= & a翻译为:“声明a为未初始化的整数,并将test声明为初始化到a的地址的指针。”这是有效的。更详细地说,它可以翻译为:
int a, *test;
test = &a;
https://stackoverflow.com/questions/44602499
复制相似问题