前言
其实一直想写关于变量的内容,因为我觉的对于变量的理解,反映了一个程序员的编程水平。或者说理解变量是编程进阶的第一座大山,这是基础中的基础。
一、“int a;” 对于编译器意味着什么?
void main()
{
int a;
}
如上的代码段,当在main函数中写下"int a;",我觉的应该有四种含义。
第一:你得到了一块内存区域,这个区域的大小跟编译器有关,一般是4个字节。而且这4个字节的地址是连续的。
第二:你得到了一个符号"a",你可以通过该符号操作第一条中分配的内存。
第三:你获得了一种存储规则 ——int。 初学者容易忽略这一点,实际上这一点很重要。因为同一个数,用不同的类型存储,最后反映到内存是不一样的。
当你给a赋值-5的时候,编译器自动去把-5转成补码,不用你亲自去算了。
当你读取a的值时,编译器自动根据补码的规则,把正确的数,显示给你。
第四:你得到了一类操作集合,编译器预定的操作你都可以使用,比如 加减乘除 取余等。这一点也很重要,有利于你理解数据结构,数据结构就是 数据类型和附加在该类型上的一组操作集合。
二、变量的存储位置
变量的存储位置,你可能会说内存中。当然是内存中,内存也是分区域的。一般分两个存储区域:堆区和栈区。
这两个区域是人为划分的,你去电脑城买内存条,肯定不会这样跟老板说:老板,给我来一条栈内存条,再拿一条堆内存条。 这样问老板肯定一脸懵逼,心思这小子是有什么大病吧。
所以这个区域是软件区分的,硬件上没任何区别。它是用寄存器标识的,这个咱就不展开讲了。
1.栈空间
什么变量分配在栈空间呢? 或者说作为程序员,你怎么使用栈空间的内存呢?
简单来说,你在函数里,定义的变量,都是在栈空间,包括在main函数里定义的变量。
比如上面的 int a;
当然这是编译器决定,你可以自己写一个编译器,函数里的变量,都分配在堆区也是可以的。没有一定之规,只是现在主流的编译器都是在栈上的。
每个空间都有每个空间的特点,如果都一样的话,还分两个空间干嘛呢。
栈空间的特点是:当定义变量的函数返回后,定义的变量生存期就结束了,就无法使用了。
无法使用的含义,不是说变量的空间没有,当初分配的空间还在,但是被栈回收了。当别的函数需要栈空间时,这块空间是可以分配出去的。 这里要好好理解一下。
2.堆空间
什么变量分配在堆空间呢? 现在可以先简单理解,定义在函数外的变量和定义在函数里,用static关键字修饰的变量,都是在堆空间。
堆空间变量的特点是:生存期是整个程序执行期间,不会随着哪个函数退出,而空间被回收。
堆空间涉及到动态分配的内容,malloc、alloc函数等。这些我们以后再讲。
总结
本篇介绍了c语言中变量的函数,该内容还是比较基础的,想要水平更上一层楼,这些知识,必须要掌握。