结构体 | |||
描述一类事物相关属性的集合,是一种自定义的数据类型 | |||
结构体的格式 | 结构体的嵌套 | 给结构体取别名 | |
struct 结构体名 { 属性1; 属性2; ... }; | struct 结构体名1 { 属性1; 属性2; }; struct 结构体名2 { 属性3; 属性4; struct 结构体名1 起名字 }; | typedef struct 结构体名 { 属性1; 属性2; ... }别名; | |
在main函数里面输入: typedef struct 结构体名 别名; | |||
数据类型 | struct 结构体名 | ||
初始化 | struct 结构体名 结构体变量名 = {属性1,属性2...}; | ||
访问 | 方法一:printf(“打印符”,结构体变量名.成员); 方法二:struct 结构体名 *p=结构体变量名; scanf(“打印符”,&p->成员); printf(“打印符”,(*p).成员); | ||
结构体之间相互赋值 | 结构体名1 = 结构体名2 |
字节对齐 | ||
字节对齐:选成员中最大的那个对齐 | ||
自然对齐方式(32OS) | 自然对齐方式(64OS) | |
char:1字节对齐 short:2字节对齐 int:4字节对齐 float:4字节对齐 double:4字节对齐,分配的时候分配两次 | char:1字节对齐 short:2字节对齐 int:4字节对齐 float:4字节对齐 double:8字节对齐 | |
节省字节 | ①将数据类型最大的放在最前面 | |
②位域/位段(一字节有八个位) int 变量名:位数; (不能使用标准的输入输出,因为找不到地址) |
自定义头文件 | ||
自定义头文件的步骤 | ①创建头文件:vi 头文件名.h ②编写头文件里面的内容 ③引入头文件,在主文件中写入:include”头文件名.h” | |
自定义头文件的内容 | ①头文件 ②宏定义 ③结构体类型的定义 ④枚举的定义 ⑤函数声明 | |
“ ”和< >的区别 | “ ” | 从用户的工作路径下搜索头文件 |
< > | 从标准库路径下搜索头文件(在cd /usr/include查看) |
gcc 编 译 器 步 骤 | 预处理(处理以#开头的文件) | gcc -E 源文件.c -o 目标.i | |
编译 (生成汇编代码) | gcc -S 目标.i -o 目标.s | ||
汇编 (将汇编语言转换成机器代码) | gcc -c 目标.s -o 目标.o | ||
链接(与其它的机器代码文件和库文件汇集生成一个可执行文件) | gcc 目标.o -o 目标 | ||
前四步操作一步完成(默认名字a.out) | gcc 源文件.c | ||
前四步操作一步完成(自己命名) | gcc 源文件.c -o 目标 | ||
执行 | ./目标(可执行文件) | ||
gcc一次就会产生新的可执行文件,这个可执行文件会覆盖掉之前的可执行文件。 | |||
a.out(可执行文件)是程序;.c文件是源代码 | |||
多文件编译 | ①将gcc的前三步合3为1:gcc -c 目标.c -o 目标.o ②将所有的.o文件汇集生成一个可执行文件:gcc 所有.o文件 -o 目标 |
Make工程管理器 | ||||
作用:make会在当前路径下找一个叫做Makefile的文件(注意:M大写或小写都可以) | ||||
Makefile命名规范 | 目标文件1:依赖文件1 (Tab键)依赖文件1是如何生成目标文件1的(命令) 目标文件2:依赖文件2 (Tab键)依赖文件2是如何生成目标文件2的(命令) ······ | |||
注意事项 | ①目标文件1和目标文件2没有联系时,默认执行目标文件1 ②一个Makefile中可以有多个目标文件 ③在调用make时,需要指定我们要运行的目标是什么(make 目标文件名),如果没有指定,默认执行目标文件1 ④在调用make时,若不想显示命令时,在命令前面加@ | |||
假目标: | 在调用make时,Makefile中的目标文件与当前目录下的文件重名 | |||
假目标解决方法:在目标文件上一行加上一行命令.PHONY(大写) | ||||
Makefile中写预定义变量、自定义变量、自动变量 | ||||
预定义变量 | AR=ar:库文件维护程序的名称 | ARFLAGS=?:库文件维护程序的选项 | ||
AS=as:汇编程序的名称 | ASFLAGS=?:汇编程序的选项 | |||
CC=cc:C编译器的名称 | CFLAGS=?:C编译器的选项 | |||
$(CC) -E:C预编译器的名称 | CPPFLAGS=?:C预编译的选项 | |||
CXX=g++:C++编译器的名称 | CXXFLAGS=?:C++编译器的选项 | |||
FC=f77:FORTRAN编译器的名称 | FFLAGS=?FORTRAN编译器的选项 | |||
RM=rm -f:文件删除程序的名称 | ||||
自定义变量 | OBJ:用于存放可执行文件 | |||
OBJS:用于存放所有的目标文件 | ||||
自动变量 | $*不包括扩展名的目标文件的名称(扩展名:例 .c 、.h 、.o······) | |||
$+:所有的依赖文件,以空格分开,并已出现的先后顺序,可能包含重复的依赖文件 | ||||
$<:第一个依赖文件的名称 | ||||
$?:所有时间戳比目标文件晚的依赖文件,并以空格分开 | ||||
$@:目标文件的完整名称 | ||||
$^:所有不重复的依赖文件,以空格分开 | ||||
$%:如果目标是归档成员,则该变量表示目标的归档成员名称 |
定义变量的两种方式 | ||
递归方式 | VAR=var | 后面的值会影响前面的执行结果 |
简单方式 | VAR:=var | 后面的值不会影响前面的执行结果 |
嵌套Makefile |
①创建文件夹 include(.h文件)、src(*.c文件)、obj(*.o文件)、bin(可执行文件) ②编写总控Makefile,先书写自定义变量or预定义变量,编写完成后,在后面一行写上export,将定义的变量传递到下一级Makefile中去 export 定义变量1 定义变量2 定义变量3 ······ ③编写src中的Makefile,将所有的.c文件编译生成.o文件,并移动到obj中 ④将所有的.o文件编译生成可执行文件,并移动到bin目录中 ⑤编写总控Makefile,先执行src中的Makefile(make -C src),再执行obj中的Makefile(make -C obj) 变量名: make -C src make -C obj |
枚举 | |||
作用 | 定义常量的一种方式 | ||
格式 | enum 枚举名 { 枚举成员1, 枚举成员2, ······ 枚举成员n }; | 规则 | ①枚举成员的值总是后一个枚举成员的值+1 ②若第一个枚举成员没有赋值,则第一个成员默认值为0 ③给后面成员赋值不会影响前面成员值的大小 |
共用体 | ||||
作用 | 所有成员的首地址是一样的,并且共用体所占的大小由成员中最大的那个决定 | |||
格式 | union 共用体名 { 属性1; 属性2; ... }; | 判断计算机是大端序还是小端序的程序 | union 共用体名 { int a; char b; }; int main(void) { union 共用体名 变量名={0}; 变量名.a=0x12345678; printf(“%#x”,变量名.b); return 0; } | 输出0x78: 小端序 输出0x12: 大端序 |
用途 | 判断计算机是大端序还是小端序 | |||
大端序 | 字节顺序存放 | |||
小端序 | 字节逆序存放 |
递归 | |
作用 | 指定规则,让计算机去执行 |
例:n的阶乘 | int jiecheng(int n) { if(1==n) { return 0; }else { return n*jiecheng(n-1); } } |
函数指针 | ||
概念 | 指向函数的指针 | |
定义 | int (*函数名)(数据类型 ,数据类型 ......)=NULL; | |
函数组指针 | int (*函数名[n])(数据类型 ,数据类型 ......)=NULL; | |
函数名代表的是函数的首地址 |
指针函数 | |
概念 | 返回值为指针的函数 |
定义 | 返回值 *函数名(数据类型 *参数名,数据类型 *参数名......) |
gdb调试器 | |
步骤 | ①程序完成后,对程序进行编译:gcc -g 源文件.c -o 文件名 ②启动gdb进行调试:gdb 文件名 ③设置断点:b main 或者 b 行号 ④运行:r |
其他参数 | s:按步调试,会进入子函数 |
n:按步调试,不进入子函数 | |
p n:打印n的值 | |
q:退出 |
main函数传参 | |
输出 | argc=参数总个数+1(命令) argv[0]=命令 argv[1]=参数1 argv[2]=参数2 ······ |