指向引用分配的指针

时间:2013-11-03 06:59:09

标签: c++

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

Q1:为什么会这样:

int *z = &x;(1)

虽然这当然不起作用:

*z = &x;(2)

Q2:同样的功能问题:

funct(int *z)

你称之为:

int x;
func(&x);

是否意味着*z=&x? 我知道我在上面的案例中传递了地址(z=&x)。但是,作业两边的两个术语应该完全相同吗?

5 个答案:

答案 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* ztype *z时,类型说明符优先,而'*'是该类型的修饰符。因此int* zint *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