1.内存的分区
1.1内存
物理内存: 实实在在存在的存储设备
虚拟内存: 操作系统虚拟出来的内存。
操作系统会在物理内存和虚拟内存之间做映射。
在 32 位系统下, 每个进程的寻址范围是 4G,0x00 00 00 00 ~0xff ff ff ff
在写应用程序的, 咱们看到的都是虚拟地址。
1.2在运行程序的时候, 操作系统会将 虚拟内存进行分区。
1).堆
在动态申请内存的时候, 在堆里开辟内存。
2).栈
主要存放局部变量。
3).静态全局区
1: 未初始化的静态全局区
静态变量(定义变量的时候, 前面加 static 修饰) , 或全局变量 , 没有初始化的, 存在此区
2: 初始化的静态全局区
全局变量、 静态变量, 赋过初值的, 存放在此区
4).代码区
存放咱们的程序代码
5).文字常量区
存放常量的。
2.普通的全局变量
概念:
在函数外部定义的变量
int num=100;//num 就是一个全局变量
int main()
{
return 0;
}
作用范围:
全局变量的作用范围, 是程序的所有地方。
只不过用之前需要声明。 声明方法 extern int num;
注意声明的时候, 不要赋值。
生命周期:
程序运行的整个过程, 一直存在, 直到程序结束。
注意: 定义普通的全局变量的时候, 如果不赋初值, 它的值默认为 0
3. 静态全局变量 static
概念:
定义全局变量的时候, 前面用 static 修饰。
static int num=100;//num 就是一个静态全局变量
int main()
{
return 0;
}
作用范围:
static 限定了静态全局变量的, 作用范围
只能在它定义的.c(源文件) 中有效
生命周期:
在程序的整个运行过程中, 一直存在。
注意: 定义静态全局变量的时候, 如果不赋初值, 它的值默认为 0
4.普通的局部变量
概念:
在函数内部定义的, 或者复合语句中定义的变量
int main()
{
int num;//局部变量
{
int a;//局部变量
}
}
作用范围:
在函数中定义的变量, 在函数中有效
在复合语句中定义的, 在复合语句中有效。
生命周期:
在函数调用之前, 局部变量不占用空间, 调用函数的时候,才为局部变量开辟空间, 函数结束了,局部变量就释放了。
在复合语句中定义的亦如此。
#include<stdio.h>
void fun()
{
int num=3;
num++;
printf("num=%d\n",num);
}
int main()
{
fun();
fun();
fun();
return 0;
}
5.静态的局部变量
概念:
定义局部变量的时候, 前面加 static 修饰
作用范围:
在它定义的函数或复合语句中有效。
生命周期:
第一次调用函数的时候, 开辟空间赋值, 函数结束后, 不释放,以后再调用函数的时候, 就不再为其开辟空间, 也不赋初值,
用的是以前的那个变量。
注意:
1:
定义 普通局部变量, 如果 不赋初值, 它的值是随机的。
定义 静态局部变量, 如果 不赋初值, 它的值是 0
2: 普通全局变量, 和静态全局变量如果不赋初值, 它的值为 0
void fun()
{
static int num=3;
num++;
printf("num=%d\n",num);
}
int main()
{
fun();
fun();
fun();
}
6.外部函数
咱们定义的普通函数, 都是外部函数。即函数可以在程序的任何一个文件中调用。
7.内部函数
在定义函数的时候, 返回值前面加 static 修饰。 这样的函数被称为内部函数。
static 限定了函数的作用范围, 在定义的.c 中有效。
7.1内部函数, 和外部函数的区别:
外部函数, 在所有地方都可以调用,
内部函数, 只能在所定义的.c 中的函数调用。
扩展:
在同一作用范围内, 不允许变量重名。
作用范围不同的可以重名。
局部范围内, 重名的全局变量不起作用。 ( 就近原则)