c高级笔记

结构体

描述一类事物相关属性的集合,是一种自定义的数据类型

结构体的格式

结构体的嵌套

给结构体取别名

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

······

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追求~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值