我对C ++中的赋值感到有点困惑:
Q1:为什么会这样:
int *z = &x;(1)
虽然这当然不起作用:
*z = &x;(2)
Q2:同样的功能问题:
funct(int *z)
你称之为:
int x;
func(&x);
是否意味着*z=&x
?
我知道我在上面的案例中传递了地址(z=&x
)。但是,作业两边的两个术语应该完全相同吗?
答案 0 :(得分:4)
假设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
传递给z
意味着z == &x
和 *z == x
,甚至更强,*z
}和x
现在是内存中完全相同的实体的别名!对*z
所做的任何更改都会影响x
,反之亦然;这两个表达式指的是相同的内存位置。
在图片中:
+-------+ +-------+
z | | | | *z
| +---+----------------------------->| |
&x | | | | x
+-------+ +-------+
答案 1 :(得分:2)
int *z = &x;(1)
delares z属于“int*
”类型“*是类型的一部分,并且不是指针取消引用的一部分 - 因此您要分配"z = &x"
而不是”{{ 1}}“
这应该解释为什么2不起作用 - (2)的正确陈述是
*z=&x
答案 2 :(得分:1)
写
是不好的规则int *z;
更好写
int* z;
这导致了这种混乱。 这里z是变量,int *是一个类型,类似于float和int类型。此类型称为指针。它在内存中存储一个地址,您可以在其中存储变量(包括指针)。
在C ++中,您将一个类型的值分配给另一个。所以在这里你指定z =&amp; x。这是有效的,因为&amp; x为您提供了指向x的指针。这确实意味着你的int x变量存在的内存中的地址。
此外,您不应混淆变量声明:
int* z;
int x;
float& f; // reference variable
和表达:
*z;
&f;
大写*和&amp;是声明的一部分,类似“短”的部分是“短整数”类型的一部分。在小写中,它们是表达式的一部分 - 像“+”和“ - ”这样的运算符。这些是完全不同的东西,尽管你使用相同的符号。
答案 3 :(得分:0)
当您编写*z = &x;
时,您正在取消引用指针z
,这意味着您正在尝试将指针符(int
)分配给{{1}的地址}}
要分配指针(而不是指针),请写下x
答案 4 :(得分:0)
当您编写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