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

C 为什么指针中包含的内存地址与指针的地址相同?,c,pointers,C,Pointers,指针变量只指向内存中的其他变量地址。指针变量显然在内存中有自己的地址 但是,这段代码为这两种类型提供了相同的内存地址 int num=10; int *ptr=# printf("Address of variable num: %p\n",ptr); printf("Address of pointer ptr: %d\n",&ptr); printf("Address of variable num: %p\n&qu

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

但是,这段代码为这两种类型提供了相同的内存地址

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

如果一个打印机同时打印这两个文件,则它似乎可以按预期工作

变量num的地址:0028FF3C

指针地址ptr:0028FF38


但如果我一次打印一个,那么两个地址都是一样的

int num=10;
int *ptr=#
printf("Address of variable num: %p\n",ptr);
printf("Address of pointer ptr: %d\n",&ptr);
printf("Address of variable num: %p\n",ptr);
//printf("Address of pointer ptr: %d\n",&ptr);
变量num的地址:0028FF38

指针地址ptr:0028FF38



我正在windows 7计算机上使用mingw编译器。它们是在堆栈中分配的局部变量。所以它们有连续的地址分配

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

如果你不知道堆栈是什么,你可能想看看这个问题的答案。

编译器只需保证变量在使用过程中保持不变

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创建任何存储。

编译器优化正在工作?这可能是因为编译器发现您没有使用变量并对其进行优化。您可以查看一下生成的汇编代码(gcc-S)是否有点迂腐:“指针变量只是指向内存中的其他对象”更准确。指针指向的对象不需要任何变量。为了让您的答案完全可以理解,您可能还需要解释为什么“一个不存在”,因为这两个都在代码中声明,这只是注释掉的printf语句(编译器优化会删除未使用的变量)。因此,这是因为编译器优化了代码以使其高效?