int *p = NULL ,c , *q;
c=10;
p = &c;
q = p;
printf ("%d and %d ",&p, &q );
输出:
2686788 and 2686780
我的问题是:据我所知,我认为内存地址是相同的,因为我已将p
分配到q
。可能是我错了。
答案 0 :(得分:15)
p
和q
是两个不同的变量,它们的地址不同。 &p
和&q
分别是p
和q
的地址
p
和q
的内容将相同,即在分配后它们将包含相同的内存地址
q = p;
p
和q
现在都指向相同的内存位置。至于插图,这在以下ASCII艺术中显示:
p
+-------+
| | c
0x200 | 0x100 +---------+ +-------+
| | +-> | |
+-------+ | 10 |
q +-> | |
+-------+ | +-------+
| | | 0x100
0x300 | 0x100 +---------+
| |
+-------+
p = q but &p != &q
注意:要打印指针数据类型,请使用%p
中的printf
说明符。
printf ("%p and %p ", (void *)&p, (void *)&q );
答案 1 :(得分:2)
您将内容变量与地址混淆。在这种情况下,p和q的内容都是c的地址。但是,作为不同的变量,它们的地址总是不同的。
答案 2 :(得分:1)
您正在显示变量的地址,而不是它指向的地址。
p和q都指向相同的地址,但它们是不同的变量,这样他们就有不同的地址。
即:
c (地址:1000) - > 10
p (地址:1010) - > 1000
q (地址:2020) - > 1000
更改为此,您应该看到所需的值。
int *p = NULL ,c , *q;
c=10;
p = &c;
q = p;
printf ("%p and %p ",p, q );
%p打印指针指向的地址。
答案 3 :(得分:1)
您正在打印指针本身的地址,而不是指针值:
$value[$key][]