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语句(编译器优化会删除未使用的变量)。因此,这是因为编译器优化了代码以使其高效?