内存存储区分为:程序区,静态存储区,动态存储区
静态存储区主要存储:全局变量和静态变量
动态存储区主要存储:1.形参。2.局部变量。3.保护现场和返回地址。
static静态局部变量,是在编译时赋初值,如果不指定初值则为0,而自动变量(局部变量)不赋初值为不确定的数。
static静态外部变量,定义在全局变量位置,特点是只能本文件使用,其他文件不能extern。
总结:
-
作用域
- 全局变量
- 外部变量(作用在当前位置以下的函数,允许其他文件引用)
- 静态外部变量(作用在当前位置以下的函数,只能本文件引用)
- 局部变量
- 自动变量(只作用在本函数,函数创建时赋值,函数结束值消失)
- 寄存器变量(只作用在本函数,函数创建时赋值,函数结束值消失)
- 静态局部变量(只作用在本函数,编译时创建,函数结束值保留)
- 形参(可以为自动变量或寄存器变量(存在CPU寄存器中))
- 全局变量
-
生命周期和存储位置分类
- 动态变量(调用函数时临时分配存储空间)
- 自动变量
- 寄存器变量
- 形参
- 静态变量(程序编译时创建,整个程序运行期间都存在)
- 静态局部变量(函数内有效)
- 静态外部变量(本文件有效)
- 外部变量
- 动态变量(调用函数时临时分配存储空间)
注意编译时赋初值,是指编译时计划好了变量内存分配方案,而不是将变量存储在内存当中,编译只是起到检查语法错误等编译错误的过程。
顺便总结一下其他知识点:
内部函数是只能被本文件调用的函数,用static修饰。
#include “在用户目录查找” <在系统目录下查找>
数据类型及存储空间
数据类型 | 16位 | 32位 | 64位 |
---|---|---|---|
char | 1 | 1 | 1 |
short | 2 | 2 | 2 |
int | 2 | 4 | 4 |
unsigned int | 2 | 4 | 4 |
float | 4 | 4 | 4 |
double | 8 | 8 | 8 |
long | 4 | 4 | 8 |
unsigned long | 4 | 4 | 8 |
long long | 8 | 8 | 8 |
*指针 | 2 | 4 | 8 |
struct所占的存储空间:
总体上遵循两个原则:
(1)整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。
(2)数据对齐原则—内存按结构体成员的先后顺序排列,当排到该成员时,其前面已摆放的空间大小必须是该成员类型大小的整数倍,如果不够则补齐,依次向后类推。
struct A
{
char a;
double b;
int c;
char d;
};//占24字节。1+7(第二个原则)+8+4+1+3(第一个原则)