70,035
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b ;
int a ;
printf("%x\n",&a); //只输出a的地址,本人机器上为61FE1C
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b ;
int a ;
printf("%x\n",&b); //只输出b的地址,本人机器上也为61FE1C
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b ;
int a ;
printf("%x\t%x\n",&a,&b); //同时输出a,b的地址,本人机器上为61FE18 61FE1C
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b;
int a;
printf("a = %d\n",a); //输出a = 16
printf("b = %d\n",b); //输出b = 0
printf("%X\n",&a); //a的地址为61FE18
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b;
int a;
printf("a = %d\n",a); //输出a = 0
printf("b = %d\n",b); //输出b = 16
printf("%X\n",&b); //b的地址也为61FE18
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b = 10000;
int a ;
printf("%X\n",&b); //b的地址是 61FE1C
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b = 10000;
int a ;
printf("a = %d\n",a);
printf("%X\n",&b); //b的地址是 61FE18
system("pause");
return 0;
}
理解和讨论之前请先学会如何观察!
这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b ;
int a ;
printf("%x\n",&a); //只输出a的地址,本人机器上为61FE1C
system("pause");
return 0;
}
這段程序中,b只在定義時出現一次。
這就是你要明白的其中一點:編譯器有優化功能,它掃描了整個程序發現b其實可以不要,於是就很可能被省略掉了。
那麽這個時候,不管你輸出的是a還是b,它的地址分配都是一樣的,即屬於該程序的變量空間只有一個整數。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int b = 10000;
int a = 10000;
printf("%X\n",&b); //你确定轮流注释这两句打印语句运行出来的结果一样?a,b同时被使用,编译优化不会舍弃任何一个,内存地址肯定不同
//printf("%X\n",&a); //估计你代码哪里有问题,要不就是进程加载时不是重复使用原来的内存(这很正常)
system("pause");
return 0;
}[/quote]

