这一讲给大家说说一些与内存相关的名词概念。先来说说标识符的作用域,“域”这个字道出了“区域,范围”这个意思。整体来说就是标识符发挥作用的范围。好了,给大家举个例子
void Test()
{
int k;
}
int main()
{
int k;
return 0;
}
这个程序中,都定义了k,你有没有想过:“这不同名了吗?”,是啊,但为什么编译器没有发错任何警告或者错误呢?原因就是这两个k的作用域不同。Test函数中的k的作用域的范围就是从定义出开始到下面有‘}’结束而main函数中的k的作用域为定义处到下面的‘}’,OK!没有任何重复交叉的地方,那么编译器就能很好地工作了。注意啦,这种位与函数内部定义的变量的作用域称为局部作用域。与之对应的就是“全局作用域”——独立于任何函数定义的变量 如:全局变量。当然还有块作用域,块作用域这个很简单就是在{}内定义的,举个例子:
void temp()
{
{
int l;//这里的l的作用域仅限于定义处到下面的‘}’出
}
l++;//error C2065: 'l' : undeclared identifier,因为这里超出了l的作用域
}
当然还有文件作用域,就是限定某个变量或者函数的作用域仅限于本文件,通过static关键字即可达到。
再说说生命周期,生命周期就是表达的变量的存在时间。生命周期与变量在内存中的存储区有很大的关系。存储区大致可以分为一下几个部分(不细分了,初学者学到这就可以了):全局区,代码区,堆区,栈区。全局区的变量拥有与程序一样的生命周期,堆区的变量的生命周期由你决定,不释放就一直存在,而栈区的变量的声明周期则是编译器自动维护,一般情况下函数调用结束则内存释放,生命结束,而有的则是到达‘}’结束生命周期。在C语言中,全局变量以及static修饰的变量都是存储在全局区,malloc分配的内存空间在堆去,其他情况就属于栈区了(先不考虑寄存器变量)。
局部变量和全局变量的概念就简单啦,上面已经有说了 。
存储类型 :就是控制变量存储在哪的。有四个关键字修饰:auto(默认),static,register, extern
下面来具体说下:
auto:指示变量存储在栈上,这是默认值
static:指示变量存储在全局区(或者叫做静态区)
register:建议性的指示编译器将变量直接安排在寄存器上,至于会不会这么做就看编译器的“心情”了
extern:告诉编译器,这个变量是在外部文件定义的,这里只是引用
好了 这讲就到这,主要给大家理清一些概念。有什么不懂的可以联系我By QQ:969722243