目录
1.作用域
1.1.局部变量
auto自动变量
在一个函数内定义,只在函数范围内有效
在复合语句中定义,只在复合语句中有效
随着函数调用的结束或复合语句的结束局部变量的声明声明周期也结束
如果没有赋初值,内容为随机
1.2.静态变量
static局部变量的作用域也是在定义的函数内有效
static局部变量的生命周期和程序运行周期一样,同时staitc局部变量的值只初始化一次,但可以赋值多次
static局部变量若未赋以初值,则由系统自动赋值:数值型变量自动赋初值0,字符型变量赋空字符
void fun2()
{
//静态局部变量,没有赋值,系统赋值为0,而且只会初始化一次
static int a;
a++;
printf("a = %d\n", a);
}
1.3.全局变量
在函数外定义,可被本文件及其它文件中的函数所共用,若其它文件中的函数调用此变量,须用extern
声明
全局变量的生命周期和程序运行周期一样
不同文件的全局变量不可重名
1.4.静态(static)全局变量
在函数外定义,作用范围被限制在所定义的文件中
不同文件静态全局变量可以重名,但作用域不冲突
static全局变量的生命周期和程序运行周期一样,同时staitc全局变量的值只初始化一次
1.5 总结
类型 | 作用域 | 生命周期 |
---|---|---|
auto变量 | 一对{}内 | 当前函数 |
static局部变量 | 一对{}内 | 整个程序运行期 |
extern变量 | 整个程序 | 整个程序运行期 |
static全局变量 | 当前文件 | 整个程序运行期 |
extern函数 | 整个程序 | 整个程序运行期 |
static函数 | 当前文件 | 整个程序运行期 |
register变量 | 一对{}内 | 当前函数 |
全局变量 | 整个程序 | 整个程序运行期 |
2.内存布局
C代码经过预处理、编译、汇编、链接
4步后生成一个可执行程序。
没有运行程序前,也就是说程序没有加载到内存前,可执行程序内部已经分好3段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分
2.1.代码区(text)
存放 CPU 执行的机器指令。通常代码区是可共享的 ,对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量
的相关信息。
2.2.全局初始化数据区/静态数据区(data段)
该区包含了在程序中明确被初始化的全局变量、已经初始化的静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)
2.3.未初始化数据区( bss 区)
存入的是全局未初始化变量和未初始化静态变量。未初始化数据区的数据在程序开始执行之前被内核初始化为 0 或者空(NULL)
2.4.内存操作函数
void *memset(void *s, int c, size_t n);
功能:将s的内存区域的前n个字节以参数c填入
void *memcpy(void *dest, const void *src, size_t n);
功能:拷贝src所指的内存内容的前n个字节到dest所值的内存地址上。
memmove()
int memcmp(const void *s1, const void *s2, size_t n);
功能:比较s1和s2所指向内存区域的前n个字节
void *malloc(size_t size);
功能:在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域,用来存放类型说明符指定的类型。分配的内存空间内容不确定,一般使用memset初始化。
void free(void *ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,指向被释放区域的首地址。对同一内存空间多次释放会出错。
3.复合类型
3.1结构体struct
表达拥有多个属性的事物对象。类似Java的对象。
//定义结构体
struct stu
{
char name[50];
int age;
};
//声明
struct stu s1;
//如果是普通变量,通过点运算符操作结构体成员
strcpy(s1.name, "abc");
s1.age = 18;
printf("s1.name = %s, s1.age = %d\n", s1.name, s1.age);
3.1结构体struct嵌套
struct person
{
char name[20];
char sex;
};
struct stu
{
int id;
struct person info;
};
//赋值
struct stu stu[2] = { 1, "lily", 'F', 2, "yuri", 'M' };
3.1结构体、指针
struct stu s1 = { "lily", 18 };
//如果是指针变量,通过->操作结构体成员
struct stu *p = &s1;
使用指针给结构体赋值
//结构体类型的定义
struct stu
{
char name[50];
int age;
};
struct stu *p = NULL;
p = (struct stu *)malloc(sizeof(struct stu));
//如果是指针变量,通过->操作结构体成员
strcpy(p->name, "test");
p->age = 22;
3.1共用体(联合体)
联合union是一个能在同一个存储空间存储不同类型数据
的类型;
联合体所占的内存长度等于其最长成员的长度
,也有叫做共用体;
同一内存段可以用来存放几种不同类型的成员,但每一瞬时只有一种起作用
;
共用体变量中起作用的成员是最后一次存放的成员
,在存入一个新的成员后原有的成员的值会被覆盖;
共用体变量的地址和它的各成员的地址都是同一地址。
3.1枚举
在枚举值表中应列出所有可用值,也称为枚举元素。
枚举值是常量,不能在程序中用赋值语句再对它赋值。
举元素本身由系统定义了一个表示序号的数值从0开始顺序定义为0,1,2 …
3.1typedef
typedef为C语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个新名字,不能创建新类型。