指针初始化和分配问题

时间:2014-01-05 02:36:34

标签: c++ pointers

我不明白这一点:

编译器可以正常使用

int *p_x=&x;

但不是这个

int *p_x,x;
*p_x=&x;

这让我感到困惑。有什么不同?这只是一个初始化约定吗?

5 个答案:

答案 0 :(得分:2)

令牌*有两个含义。

在第二个例子中,它是解除引用运算符,它获取指针指向的值:

int *p_x,x;
*p_x=&x;

p_x是指向int的指针。

xint

&xx的地址(指向int)。

*p_x是值p_x指向(int)。 *这里是取消引用运算符。

您正尝试将指针&x分配给int

在第一个示例int *p_x = &x中,令牌*实际上属于该类型,即int*,指向int的指针。这里不是解除引用的运营商。因此,分配是p_x而不是*p_x。如果将行写为int* p_x = &x,这将变得更加清晰。将&x分配给p_x很好,因为两者都是int的指针/地址类型。

修复第二个示例的最简单方法是将*p_x = &x重写为p_x = &x。然后再次将&x分配给指针而不是指针指向的值。

答案 1 :(得分:1)

下面:

int *p_x=&x;

您宣布p_x为指向int的指针,并将p_x的值指定为合法的x地址。

但是在这里:

int *p_x,x;
*p_x=&x;

您将p_x声明为指向intx的指针作为整数。然后,您尝试将x的地址分配给p_x指向的对象,这意味着将x的地址指定为x,这不合法{ {1}}不是指针。它会产生错误:x

答案 2 :(得分:0)

int *p_x,x;

相当于:

int *p_x;
int x;

因此,您确实要删除前导*以使其有效:

p_x = &x;

这与int *p_x=&x;基本相同,我会将其标注为int* p_x = &x,以澄清p_x属于int*类型。

答案 3 :(得分:0)

int *p_x=&x;

创建一个名为p_x type(int *)的变量(它是指向整数的指针),然后将其值设置为x的地址。

int *p_x,x;
*p_x=&x;

创建一个名为p_x type(int *)的变量(它是指向整数的指针,换句话说是一个地址)和一个名为x type integer的变量。

p_x指向的位置(随机位置,因为它未初始化),请输入x的地址;

不幸的是,指针类型是用*定义的,并且访问你也使用*的地址。

答案 4 :(得分:0)

虽然这很常见(我自己也用它):

int *p;
实际上这有点误导。我们没有声明名为“* p”的int,我们声明int*名为“p”。

此:

int *p_x=&x;

相当于:

int* p_x;
p_x=&x;    // perfectly correct

但这是不正确的:

int *p_x,x;
*p_x=&x;   // ouch!

您正在为int分配一个地址(即使您正确地转换它,您也会取消引用未初始化的指针,这会导致未定义的行为)。