标签:
“天地玄黄,宇宙洪荒”,先有天地,之后方有古今。
变量同是,先有变量的作用域(存在的地点),然后出现了变量的生存期(存在的时间)。
【变量存储的方式】
首先变量实际上是存放到两个区域的:
【变量分类】
局部变量:在[函数]内部声明的变量。
【作用域】:从定义变量的位置到本函数结束。
<1>自动变量(auto变量),即动态局部变量,不专门声明为static的变量。
分类:<11>函数形参;
<12>函数中定义的变量;
<13>函数调用的现场保护和返回地址;
存放位置:动态存储区;
【生存期】:调用函数时,赋初值生存,结束调用死亡。
<2>静态局部变量(static局部变量),通过static声明;
存放位置:静态存储区;
【生存期】:调用函数时,赋初值生存,结束调用继续存在
【缺点】:长期占用不释放,多占内存,不建议多使用。
<3>寄存器变量(register变量),通过register声明;
存放位置:寄存器(寄存器的访问速度超过内存访问速度);
【生存期】:同静态局部变量,较少见。
[在main函数中定义变量是局部还是全局的]
是局部变量,任何函数内部的变量都是局部的。
【内存中的堆和栈】
// 来看一个网上很流行的经典例子:main.c
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main(){
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10); 堆
p2 = (char *)malloc(20); 堆
}
void sub()
{
int a[100]; // 局部变量,分配在栈上,退出子程序自动释放。
int *p = (int *)malloc( 100 ); // 分配在堆上,需要用free释放。
}
【变量的声明和定义的关系】
把建立存储空间的声明成为定义(int a=4;),把未建立存储空间的声明成为声明(extern int a;);
【内部函数和外部函数】
函数本质上是外部的,可以被外部的其他函数和外部文件夹中的文件所访问。
标签:
原文地址:http://www.cnblogs.com/yzxk/p/4433581.html