为什么指针中包含的内存地址和指针的地址相同?

时间:2015-11-07 10:46:58

标签: c pointers

指针变量只指向内存中的其他变量地址。并且指针变量显然在内存中有自己的地址。

但是,此代码为两者提供相同的内存地址。

int num=10;
int *ptr=#
printf("Address of variable num: %p\n",ptr);
printf("Address of pointer ptr: %d\n",&ptr);

如果同时打印它们,那么它似乎按预期工作。

  

变量号的地址:0028FF3C

     

指针地址:0028FF38

但是,如果我一次打印一个,那么两者都给出相同的地址。

printf("Address of variable num: %p\n",ptr);
//printf("Address of pointer ptr: %d\n",&ptr);
  

变量号的地址:0028FF38

//printf("Address of variable num: %p\n",ptr);
printf("Address of pointer ptr: %d\n",&ptr);
  

指针地址:0028FF38

我在Windows 7机器上使用mingw编译器。

2 个答案:

答案 0 :(得分:4)

编译器只需要保证变量只要使用就会持续。

int a = 5;
int b = 7;
printf( "a * 5 = %d\n", a * 5); /* after this point, a is no longer needed */
printf( "b * 9 = %d\n", b * 9); /* after this point, b is no longer needed */

因此,编译器可以推迟b初始化,直到a完成后,并且只使用一个内存位置。

同样在这个例子中,它可能会将常量25和63推入堆栈,并且不会为a或b创建任何存储。

答案 1 :(得分:2)

它们是堆栈中分配的局部变量。所以他们有连续的地址分配。

编译器通常会删除任何未使用的变量,因此注释掉printf可能会导致变量不存在。当一个不在那里时,只有第一个被放入堆栈。 只要堆栈从同一个地方开始并且在其上具有相同的调用堆栈和局部变量,它们的地址就是相同的。

如果您不知道堆栈是什么,您可能想看看这个问题的答案。 What and where are the stack and heap?