我是一个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;
}
答案 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;