我对 C++ 中的赋值有点困惑:
Q1:为什么会这样:
int *z = &x;(1)
当然,这不起作用:
*z = &x;(2)
Q2:功能相同的问题:
funct(int *z)
你称之为:
int x;
func(&x);
这是什么意思*z=&x
?我知道我在上述情况下传递了地址 ( z=&x
)。但是赋值两侧的两个术语应该完全相同吗?
我对 C++ 中的赋值有点困惑:
Q1:为什么会这样:
int *z = &x;(1)
当然,这不起作用:
*z = &x;(2)
Q2:功能相同的问题:
funct(int *z)
你称之为:
int x;
func(&x);
这是什么意思*z=&x
?我知道我在上述情况下传递了地址 ( z=&x
)。但是赋值两侧的两个术语应该完全相同吗?
假设x
被声明为int
int x;
然后你的第一行
int *z = &x;
说声明z
是指向 int 的类型指针。用指向 int 的指针初始化它x
。都好。它类型检查正常。 z
是一个指向 int 的指针,&x
.
但现在
*z = &x;
失败是因为z
是指向 int 的指针,所以*z
是 int!您不能将&x
作为指向 int 的指针的 分配给 int。那是类型不匹配。
现在在你的函数调用问题中
void func(int *z) {...}
你的来电
func(&x);
很好。它将&x
一个指向 int 的指针按值传递给参数z
,该参数本身就是一个指向 int 的指针。你的内心func
确实得到了z = &x
. 按值传递参数与赋值非常相似。
附录
您将看到诸如&x
传递给使用指针类型声明的参数之类的值的原因int *z
是它允许x
通过参数修改调用者的值z
。换句话说:
void func(int *z) {
*z = *z + 1;
}
如果这样调用
int main() {
int x = 10;
func(&x);
cout << x << '\n';
}
将输出 11。传递&x
toz
意味着z == &x
and *z == x
,甚至更强,that *z
andx
现在是内存中完全相同的实体的别名!*z
对影响所做的任何更改,x
反之亦然;这两个表达式引用相同的内存位置。
在图片中:
+-------+ +-------+
z | | | | *z
| +---+----------------------------->| |
&x | | | | x
+-------+ +-------+
int *z = &x;(1)
delares z 是“ int*
”类型的“*”是类型的一部分,而不是指针取消引用的一部分——所以你正在分配"z = &x"
而不是“ *z=&x
”
这也应该解释为什么 2 不起作用 - (2) 的正确陈述是
z = &x;
写是不好的规则
int *z;
写得更好
int* z;
这导致了这种混乱。这里 z 是变量,int* 是一个类型,类似于 float 和 int 类型。这种类型称为指针。它在内存中存储一个地址,您可以在其中存储变量(包括指针)。
在 C++ 中,您将一种类型的一个值分配给另一个值。所以在这里你分配z = &x。这是因为 &x 给了你一个指向 x 的指针。这确实意味着您的 int x 变量所在的内存地址。
你也不应该混淆变量的声明:
int* z;
int x;
float& f; // reference variable
和表达:
*z;
&f;
大写 * 和 & 是声明的一部分,是类型的一部分,如“short”是“short int”类型的一部分。在小写中,它们是表达式的一部分 - 运算符,如“+”和“-”。这些是完全不同的东西,尽管您对它们使用相同的符号。
当您编写时*z = &x;
,您正在取消引用指针z
,这意味着您正在尝试将指针(an int
)x
分配给要分配指针(而不是指针)的地址,请写 z = &x;
当您编写type* z
或type *z
类型说明符优先且“*”是类型的修饰符时。因此两者int* z
和都int *z
意味着“声明 z,使得 z 是指向 int 类型的指针”。
int* z = &i; // pointer-to-int z = the address of i
int *z; // z is a pointer-to-int
z = &i; // pointer-to-int z = the address of i
int *z; // z is a pointer-to-int
*z = &i; // take the address of i and store it in integer who's address z contains