这项任务后它的内存地址不一样吗?

时间:2015-07-07 17:01:22

标签: c pointers

int *p = NULL ,c , *q;
c=10;
p = &c;
q = p; 

printf ("%d and %d ",&p, &q );

输出:

2686788 and 2686780

我的问题是:据我所知,我认为内存地址是相同的,因为我已将p分配到q。可能是我错了。

4 个答案:

答案 0 :(得分:15)

pq是两个不同的变量,它们的地址不同。 &p&q分别是pq的地址 pq的内容将相同,即在分配后它们将包含相同的内存地址

q = p;      

pq现在都指向相同的内存位置。至于插图,这在以下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][]