我不明白这一点:
编译器可以正常使用
int *p_x=&x;
但不是这个
int *p_x,x;
*p_x=&x;
这让我感到困惑。有什么不同?这只是一个初始化约定吗?
答案 0 :(得分:2)
令牌*
有两个含义。
在第二个例子中,它是解除引用运算符,它获取指针指向的值:
int *p_x,x;
*p_x=&x;
p_x
是指向int
的指针。
x
是int
。
&x
是x
的地址(指向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
声明为指向int
和x
的指针作为整数。然后,您尝试将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分配一个地址(即使您正确地转换它,您也会取消引用未初始化的指针,这会导致未定义的行为)。