C语言 单片机 嵌入式 宏定义问题 #define

比如说我定义#define a 1
a这个不算变量,那么这个a的值存放在哪里?为什么内存中查不到a的地址和值呢?
用sizeof测试,又可以知道大的类型大小。。。。。
非常困惑。。。
还有顺便问问c中的立即数、常数会存ram里面么?局部变量又是怎么存贮的,自己一下子也搞混了
编译系统管理的内存区地址不能查阅么?
vc调试里面可以查询32位地址,我的内存也才2G,那么为什么查不到呢?编译系统管理的内存区在何处?

-------------------------------------------
谢谢大家的发言,我自己才琢磨下

1,a这个不算变量,那么这个a的值存放在哪里?为什么内存中查不到a的地址和值呢?
--因为单片机里根本就没有a,只有常数1,如果你的a是指令的一部分(通过汇编器看)是没有地址和值的,如果以表格方式存储,应该能查到地址;

2,还有顺便问问c中的立即数、常数会存ram里面么?局部变量又是怎么存贮的?
--立即数是指令的一部分,被编译成了机器码的一部分;常数一般以表格形式编程,存在ROM中;局部变量一般是使用寄存器R1~R7存储;

3,编译系统管理的内存区地址不能查阅么?
--当然能查

4,vc调试里面可以查询32位地址,我的内存也才2G,那么这个编译系统管理的内存区在何处?
--要查了才知道,但为什么要知道呢?

另外,出现问题1,说明你需要看看C语言教材或编译原理;出现问题2,说明你需要看看C汇编后的样子,以及8051汇编语言及机器码 :)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-09-09
宏定义 #define只是在预编译时简单的文字替换,其实并没有定义任何的变量。
#define a 1
uchar i;
main()
{i=a;}
其实在预编译以后,程序就成了{i=1;}程序里面根本就没有a。
猜测sizeof得到的并不是a,是宏定义下的那个东西的长度。因为sizeof(a),预编译后就是sizeof(1)。

立即数、常数都在ROM里面,占用程序空间。当程序取用这些数时,会将值赋给RAM里面的某一个变量(或送入某一寄存器),参与程序的运行。
局部变量则是在RAM里面,调用函数时临时分配的。本回答被网友采纳
第2个回答  2010-09-09
这个a是常量,叫符号常量。存放在编译系统管理的内存区。

C语言中所有的常量都存放在系统管理的内存区。而不是用户区。
局部变量分auto型和static型,前者放在动态的用户存储区,后者放在静态的用户存储区。
相似回答