这两种变量赋值方式的区别是什么?
int x = 100;
int *valuePtr = &x;
*valuePtr = 20;
为什么我不能使用 int *valuePtr = x;
这样做?
我会给出一个编译错误。但在 int *valuePtr = &x;
然后 *valuePtr = 20;
不会给出编译错误。
谁能解释一下?
int x = 100;
这声明了一个 int
变量,称为 x
并将其初始化为100。
int *valuePtr = &x;
这就声明了一个指向int
变量,称为 valuePtr
的地址来初始化它。x
(&
是地址运算符)。)
*valuePtr = 20;
表达式 *valuePtr
提述 指针,并获得对其目标的引用--------。int
对象的地址。 所以整个表达式将20分配给 尖对 int
对象。
为什么我不能使用
int *valuePtr = x;
这种方式?
在这种情况下,这是不允许的,因为 x
并非 int *
的指针int
),它是一个 int
. 这也是你不能说的原因。std::string foo = 10;
-- 这些类型是不兼容的,它们之间没有隐式转换。
下面是总结。
x
有类型 int
.&x
有类型 int *
的地址,并评价为 x
.int
并不隐含着可转换为 int *
所以 int *valuePtr = x;
不编译。valuePtr
有类型 int *
所以你可以存储 &x
中(类型匹配)。*valuePtr
具有类型 int &
指的是 int
,所以可以通过指针给它分配一个新的值。请记住,指针只是一个变量,保存着其他东西的地址。它基本上是一个标志,表示 "你想要的东西已经结束了"。那里". int *valuePtr = &x;
更新标志,使其指向 x
. *valuePtr = 20;
以下 的标志,并试图存储 20
在标志指向的位置。*int valuePtr = x;
是无效的语法,它没有任何意义。如果你的意思是 int *valuePtr = x;
那就不行了 x
是一个整数,它不是一个指针,所以你不能把它赋值给一个指针(类型不匹配)。