1 内存的分区
1内存:物理内存(实实在在的存储设备),虚拟内存(操作系统虚拟出来的内存);
在写应用程序时,我们看到的都是虚拟地址;
2虚拟内存分区:
堆:在动态申请内存时,在堆里开辟内存
栈:主要存放局部变量
静态全局区:a-未初始化的静态全局区
静态变量(定义变量的时候,前面加一个static修饰),或全局变量,没有初始化的,存在此区
b-初始化的静态全局区
全局变量,静态变量,赋过初值的存放在此区
代码区:存放程序代码
文字常量区:存放常量的
2普通全局变量
概念:在函数外面定义的变量
例 int num=100;//num就是一个全局变量,不加static就是普通全局变量,
int main()
{
return 0;
}
作用范围:程序的所有地方;不过在别的地方用的时候,用之前需要声明(方法:extern int num;)
注意声明的时候,不要赋值
生命周期:程序运行的整个过程
注意:定义普通全局变量的时候,如果不赋初值,它的值默认为零;
3静态全局变量 static
概念:定义全局变量,前面用static修饰
作用范围:static限定了静态全局变量。作用范围只能是在它定义的.c(源文件)中有效。
生命周期:程序运行的整个过程
注意:定义静态全局变量的时候,如果不赋初值,它的值默认为零;
4普通局部变量
概念:在函数内部定义的。或者复合语句中定义的变量;
int main()
{
int num;//普通局部变量
{
int a;//普通局部变量
}
}
作用范围:在函数中定义的,在他的函数中有效;在复合语句中定义的,在他的复合语句中有效;9
生命周期:在函数调用之前,局部变量不占用空间,调用函数的时候,才为局部变量开辟空间,函数结束了局部变量就释放了。
#include<stdio.h>
void fun(void);int main
{
int num = 100;
{
int a = 20;
}
printf("a=%d\n", a);
return 0;
}//像这样写就会报错,因为因为定义a 是在第一个花括号里面,她并不在第二个花括号里起作用
#include<stdio.h>
void fun(void);
int main()
{
int num = 100;
{
int a = 20;
}
return 0;
}
void fun(void) {
printf("num=%d\n", num);//这样也会报错,因为num在fun函数里没有定义;
5静态局部变量
概念:定义局部变量时,前面加static修饰作用范围:爱他定义的函数或者复合语句中有效
生命周期:第一次调用函数的时候,开辟空间复制,函数结束后,不释放;
以后再调用的时候,就不再为其开辟空间,也不赋初值;用的是以前的变量;
#include<stdio.h>
void fun(void)
{
static int num = 3;
num++;
printf("%d", num);
}
int main()
{
fun();
fun();
fun();
return 0;
}
以下为输出结果,由此可见,第一次调用函数的时候,开辟空间复制,函数结束后,不释放;
以后再调用的时候,就不再为其开辟空间,也不赋初值;用的是以前的变量
456
C:\Users\86152\source\repos\实验四\x64\Debug\实验四.exe (进程 48340)已退出,代码为 0。
按任意键关闭此窗口. . .
扩展:变量存储类别
在同一作用范围内,不约需变量重名;
作用范围不停的可以忠明
局部范围内,重名的全局变量不起作用(就近原则)。
6外部函数
咱们定义的的普通函数都是外部函数,积函数可以在程序的任何一个文件中调用。
7内部函数
概念:在定义函数的时候,返回值类型前面加static修饰,
static限定了函数的之作用范围,在定义的.c中有效