指针:初始化与声明

时间:2017-06-17 08:38:36

标签: c++ pointers c++14

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

this

但为什么这也有用呢?

#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;
}

6 个答案:

答案 0 :(得分:30)

这两行之间的根本区别

*test= &a; // 1
int a, *test= &a; // 2

是第一个是一个表达式,由具有已知优先级规则的运算符调用组成:

       operator=
          /\
        /    \
      /        \
operator*    operator&
  |             | 
 test           a

而第二个是变量声明和初始化,相当于int a;的声明,后跟:

   int*     test    =  &a
// ^^        ^^        ^^
//type    variable    expression giving
//          name        initial value

第二行甚至没有使用operator*operator=

令牌*=(以及&以及,)的含义取决于上下文出现:表达式内部代表相应的运算符,但在声明*中通常显示为类型的一部分(表示“指向”),=用于标记开头的(复制)初始化表达式(,分隔多个声明,&作为“引用”也是该类型的一部分。)

答案 1 :(得分:3)

int a, *test= &a;

相当于:

int a;
int* test = &a;

并且在初始化test时非常有效,该a具有指向int 指针,其地址为变量SELECT * FROM [<SheetName>$<optional range>] ,其类型为 int

答案 2 :(得分:2)

您对*。

的两种用法感到困惑

在您的第一个示例中,您正在使用它取消引用指针。 在第二个示例中,您将使用它来声明指向int&#34;的&#34;。

因此,当您在声明中使用*时,可以说您正在声明指针。

答案 3 :(得分:2)

在第一种情况下,你实际上是在做这样的初始化,

int *test = &a;

这意味着,您正在初始化一个指向您提及*的指针,告诉编译器它是一个指针。

但是在初始化之后执行*test(带有星号的 )意味着您正在尝试访问分配给指针test的地址处的值。
换句话说,执行*test意味着您获得a的值,因为a的地址存储在指针test中,这是通过执行{{1}来完成的}}。
&a是获取任何变量地址的运算符。 &是获取地址值的运算符。

所以初始化&amp;编译器会以不同方式推断出赋值,即使两种情况都存在星号*

答案 4 :(得分:1)

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

#include <memory> // for std::addressof

int a{};
auto const p_a{::std::addressof(a)};

答案 5 :(得分:0)

那里有一个微妙的区别。

当你声明int a,* test时,你说&#34;声明一个整数,并将test声明为指向整数的指针,两者都未初始化。&#34;

在您的第一个示例中,您在声明后将* test设置为&amp; a。这转换为:&#34;将测试指向的整数(内存地址)设置为a的地址。&#34;这几乎肯定会崩溃,因为测试没有被初始化,所以它可能是空指针或乱码。

在另一个例子中,int a,* test =&amp; a转换为:&#34;将a声明为未初始化的整数,并将test声明为初始化为。&#34;的地址的指针。那是有效的。更详细地说,它转化为:

int a, *test;
test = &a;