2

我对 C++ 中的赋值有点困惑:

Q1:为什么会这样:

int *z = &x;(1)

当然,这不起作用:

*z = &x;(2)

Q2:功能相同的问题:

funct(int *z)

你称之为:

int x;
func(&x);

这是什么意思*z=&x?我知道我在上述情况下传递了地址 ( z=&x)。但是赋值两侧的两个术语应该完全相同吗?

4

5 回答 5

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。传递&xtoz意味着z == &x and *z == x,甚至更强,that *zandx现在是内存中完全相同的实体的别名!*z对影响所做的任何更改,x反之亦然;这两个表达式引用相同的内存位置。

在图片中:

     +-------+                              +-------+
  z  |       |                              |       |  *z
     |   +---+----------------------------->|       | 
 &x  |       |                              |       |  x
     +-------+                              +-------+
于 2013-11-03T07:06:01.877 回答
2
int *z = &x;(1)

delares z 是“ int*”类型的“*”是类型的一部分,而不是指针取消引用的一部分——所以你正在分配"z = &x"而不是“ *z=&x

这也应该解释为什么 2 不起作用 - (2) 的正确陈述是

 z = &x;
于 2013-11-03T07:04:41.443 回答
1

写是不好的规则

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”类型的一部分。在小写中,它们是表达式的一部分 - 运算符,如“+”和“-”。这些是完全不同的东西,尽管您对它们使用相同的符号。

于 2013-11-03T07:10:54.490 回答
0

当您编写时*z = &x;,您正在取消引用指针z,这意味着您正在尝试将指针(an intx
分配给要分配指针(而不是指针)的地址,请写 z = &x;

于 2013-11-03T07:04:05.683 回答
0

当您编写type* ztype *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
于 2013-11-03T07:12:53.150 回答