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
,因此会出现此错误.
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
,它未初始化并可能指向某个无效位置.写在那里,任何事都可能发生.