变量的存储类型
1.变量的定义
对内存空间的抽象
<存储类型><数据类型>变量名;
auto(默认)
2.变量的生命周期
变量的有效期,从申请内存开始,到释放内存空间结束
3.变量的作用域
变量在哪个范围内有效
4.链接点
外部链接:
文件作用域
可以在一个多文件工程中任何地方使用
使用要求:全局变量,不使用static关键字修饰
内部链接:
作用域:文件作用域
在一个文件的任何地方使用
全局变量,使用static关键字修饰
空链接:
代码块作用域或者函数原型作用域
函数内部有效
5.auto,static,extern,register
static:
1.限定作用域
2.延长生命周期
3.修饰局部变量只初始化一次
extern:声明外部引用
register:
分配寄存器存放该变量(如果寄存器不够用,分配不到,就在内存中分配相应大小的空间)
6.4G虚拟内存空间划分:
0G———3G:用户空间
代码段:
代码
数据段:
常量区 特点:只读
.data段 初始化的全局变量和静态局部变量
.bss段 未初始化的全局变量和静态局部变量 。bss段清零
堆区:用户自己申请的空间
栈区:局部变量
3G———4G:内核空间
动态内存分配
#include
malloc:
功能:在堆中分配内存空间
参数:
@size 分配内存空间的大小(字节)
返回值:成功返回申请到的内存空间首地址,失败返回NULL
void *malloc(size_t size);
free:
释放申请到的内存空间
void free(void *ptr);
typedef
typedef:重命名数据类型
typedef unsigned long ul;
typedef unsigned int u32;
typedef struct student{
int num;
char name[32];
char sex;
}stu,*stup;
函数指针:
<数据类型>(*函数指针变量名)(<形参列表>);
int *(*pfunc)(char,struct student *);
typedef int* (*func_t)(char ,stup);
func_t funcp; <==> int *(*funcp)(char ,stup);
/*
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
void xxx(int a)
{
...
}
*/
make工程管理工具
根据规则主动检测时间戳自动发现更新过的文件而减少编译的工作量
减少重复的编译工作
GNUmakefile、makefile、Makefile
1.格式:
三要素:
目标:依赖
。PHONY:伪目标
不会检测时间戳不用生成目标文件
2.makefile变量
1.自定义变量
递归展开的方式:变量名=值
特点:向后引用
例子:
foo = $(bar)
bar = $(ugh)
ugh = Huh?
简单方式:变量名:=值
m := mm
x := $(m)
y := $(x)bar
为变量添加值:变量名+=值
obj:=main.o
obj+=add.o --->>> obj := main.o add.o
变量名?=值
2.预定义变量
库文件维护程序的名称,默认值为ar。
AS汇编程序的名称,默认值为as。
CC C编译器的名称,默认值为cc。
CPP C预编译器的名称,默认值为$(CC) –E。
CXX C++编译器的名称,默认值为g++。
FC FORTRAN编译器的名称,默认值为f77
RM 文件删除程序的名称,默认值为rm -f
3.自动变量
$* 不包含扩展名的目标文件名称
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$< 第一个依赖文件的名称
$? 所有时间戳比目标文件晚的的依赖文件,并以空格分开
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
依赖文件:
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$^ 所有不重复的目标依赖文件,以空格分开
$< 第一个依赖文件的名称
目标文件:
$* 不包含扩展名的目标文件名称
$@ 目标文件的完整名称
make [选项] 目标
-C :-C /dir 到指定的路径下执行该路径中的Makefile
-f :-f 文件名 指定把该文件当成make的配置文件进行执行