为什么我不能直接将int赋给int指针,如下所示:int*p = 6;?

Aqu*_*irl 7 c c++ pointers initialization variable-assignment

错误:从'int'到'int*'的转换无效
int *q = 8;

工作良好.
*q = 6;

为什么我不能直接一个int分配给这样一个int指针:int *q = 6; 我可以在下一行安全地分配它吗?

son*_*yao 22

因为它们完全不同.第一个是使用初始化表达式定义变量,即初始化(指针本身):

int *         q                      = 8;
~~~~~         ~                      ~~~
type is int*; name of variable is q; initialized with 8
Run Code Online (Sandbox Code Playgroud)

第二个是赋值(指针指向的对象):

*q                              = 6;
~~                              ~~~
dereference on q via operator*; assign the resulting lvalue pointed by q to 6
Run Code Online (Sandbox Code Playgroud)

并且,int *p = 6;意味着定义一个p用类型命名的变量int*并用6它初始化它,失败因为6不能用于直接初始化指针(即错误"从'int'无效转换为'int*'").


use*_*670 14

*符号在您的代码段中重复使用两种不同的purpuses.第一次将它用作类型声明的一部分int *,声明指向int的指针.第二次它用于取消引用指针*q,调用间接运算符.

*也可以用来调用乘法运算符*q = *q * *q;;

要为指针指向的整数赋值,需要取消引用它.并且要将指针本身(即int *q = 8;正在做的事情)所需的积分值分配给0 reinterpret_cast,因此会出现此错误.

  • "两个不同的目的"实际上是不真实的.让我们看一下_two_指针的定义:`int*p,*q;`.如果`*`属于`int`,你会将两个指针定义为`int*p,q/*wrong*/;`这是一个不幸的C兼容性残余,因为在其他上下文中,例如`std :: vector <int*>`it*是*类型的一部分.. (5认同)

Ste*_*ner 6

Statement int *q定义了"指向整数的指针"类型的变量,因此初始化需要是指针值,而不是整数值.所以int *q = 8不一样int *q; *q = 8(因为它取消引用了一个未初始化的指针,这将是未定义的行为),但更像是int *q; q = 8,这使得误解更加透明.


小智 5

这个:

int *q = 8;
Run Code Online (Sandbox Code Playgroud)

是一个初始化.它初始化q(指针),而不是*q(它指向的).使用赋值而不是初始化等效地写这个看起来像:

int *q;
q = 8;
Run Code Online (Sandbox Code Playgroud)

所以你看它没有意义.(并且,当然不允许 - int不是指针)

只是为了确定,如果你写:

int *q;
*q = 8;
Run Code Online (Sandbox Code Playgroud)

这在语法上是正确的,但未定义的行为.您的指针未指向类型的对象int,它未初始化并可能指向某个无效位置.写在那里,任何事都可能发生.

  • @Lundin谈论*语法*,稍后详细阐述.我不认为这是有效的代码. (2认同)