首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >指针:初始化与声明

指针:初始化与声明
EN

Stack Overflow用户
提问于 2017-06-17 16:38:36
回答 3查看 1K关注 0票数 17

我是一个C++新手,我很确定这是一个愚蠢的问题,但我就是不太明白为什么以下代码会出现(不会出现)错误:

代码语言:javascript
复制
#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;
}

但为什么这也能行得通呢?

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

发布于 2017-06-17 16:48:59

您混淆了*的两种用法。

在您的第一个示例中,您使用它来取消引用一个指针。在第二个示例中,您将使用它来声明一个“int指针”。

所以,当你在一个声明中使用*时,它表示你声明了一个指针。

票数 2
EN

Stack Overflow用户

发布于 2017-06-17 17:45:13

您刚刚碰到了两个可怕的语言设计点:将声明压缩到一行中,以及将*符号重用于不相关的目的。在本例中,*用于声明指针(当它用作类型签名int a,*test;的一部分时)和引用指针(当它用作语句*test = &a;时)。最好的做法是一次声明一个变量,使用自动类型推导而不是类型复制,并使用专用的addressof方法:

代码语言:javascript
复制
#include <memory> // for std::addressof

int a{};
auto const p_a{::std::addressof(a)};
票数 1
EN

Stack Overflow用户

发布于 2017-06-18 08:49:09

这里有一个细微的区别。

当您声明int,*test时,您是在说“将a声明为整数,并将test声明为指向整数的指针,但两者均未初始化。”

在第一个示例中,在声明之后将*test设置为&a。翻译为:“将测试指向的整数(内存地址)设置为的地址。”这几乎肯定会崩溃,因为test没有初始化,所以它要么是一个空指针,要么是胡言乱语。

在另一个示例中,int,*test= & a翻译为:“声明a为未初始化的整数,并将test声明为初始化到a的地址的指针。”这是有效的。更详细地说,它可以翻译为:

代码语言:javascript
复制
int a, *test;
test = &a;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44602499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档