C高级
指针函数
概念:函数返回值类型是指针类型的函数
函数指针
概念:指向函数的指针(函数的本质是存在内存中的一段二进制代码,因此会占据一片空间,同时该片空间的首地址用函数名来代替)
定义函数指针方式:
返回值类型 (*pFunc)(形参列表);
typedef
typedef:给已存在的一个数据类型在其作用域内取一个别名
用法:
typedef 类型名 新类型名;
函数指针数组
函数指针数组:数组元素类型是函数指针类型的数组。
函数指针类型 数组名[元素个数];
返回值类型 (*数组名[元素个数])(参数表列表);
回调函数
概念:把B函数的地址即(函数名或者&函数名)作为A函数的参数,传递给A函数,在A函数中通过使用这个参数来间接调B函数的过程就称为“回调函数”
动态内存管理
针对:堆区
在堆区中:常见的操作有—》申请空间,释放空间,初始化空间
因此:以上操作全局需要借助于函数来实现:
申请空间:malloc calloc
释放空间:free
初始化空间:memset
扩容空间:realloc
头文件:
#include <stdlib.h>
申请空间
(1)、void *malloc(size_t size);
功能:申请空间在堆区中
参数:所需申请空间占据的字节数
返回值:成功返回连续空间的首地址,失败返回NULL
(2)、void *calloc(size_t nmemb, size_t size);
功能:申请空间
参数:
参数1:所需申请的元素个数
参数2:元素的大小(字节数)
返回值:成功返回连续空间的首地址,失败返回NULL
注意:calloc在申请完空间之后,会自动将申请的连续空间初始化为’\0’
释放空间
(1)、void free(void *ptr);
功能:释放空间
参数:所需释放空间的首地址
返回值:无返回值
扩容空间
(1)、void *realloc(void *ptr, size_t size);
功能:用来扩容空间
参数:
参数1:所需扩容空间的首地址(malloc的返回值)
参数2:扩容之后总的字节数(旧 + 新)
返回值:成功返回扩容之后空间的首地址,失败返回NULL
重置空间
(5)、void *memset(void *s, int c, size_t n);
功能:用来重置一片内存空间 (当做清空空间居多!)
参数:
参数1:所需重置内存空间首地址
参数2:所需重置的字符 ---》’\0’ , 0
参数3:所需重置内存空间的大小---》sizeof()
结构体
概念:是一种构造数据类型,目的是为了将一个事物的多重属性表示清楚(属性可能是不同的数据类型,也可以是相同的数据类型)。
结构体类型:
struct 结构体名
{
数据类型1 成员1 ;
数据类型2 成员2;
。。。。
数据类型N 成员N;
};
定义结构体:
struct 结构体名 变量名;
结构体成员赋值:
变量名= {值1,值2.。。。。。。};
struct 结构体名 变量名 = {值1,值2,。。。。。};
访问结构体成员:
方式1:变量名.成员名;
方式2:结构体指针->成员名;
共用体
概念:多个成员共用同一片空间,因此开辟内存空间时,会按照占据内存空间最大的数据类型进行开辟。
定义格式:
union 共用体名
{
数据类型1 成员1;
。。。。
数据类型N 成员N
};
枚举
概念:跟宏比较类似,意味着也是一些常量值,只不过这些常量值是被放在一个集合里面。
如何定义一个枚举类型?
enum 枚举名
{
枚举数值名1,
枚举数值名2,
。。。。
};
LINUX
调试BUG的方式
gdb调试工具
流程:
(1)生成带有调试信息环境的可执行文件
方式:gcc -g test.c -o App
(2)进入该可执行文件
方式:gdb App
(3)设置断点 -->让程序从哪里开始调试
方式:b 行标/函数名
(4)运行
方式: r
(5)单步运行
n: 不进入子函数内部,但不代表不执行子函数
s: 进入子函数内容,并开始执行子函数中每一行代码
(6)找到错误所在的行
响应:看到程序打印出一行文本“Program recived Sigmentation fault....”,上一行就是引起错误的所在行。
(7)结束调试
方式:按下q退出即可。
Make中的变量
(1)用户自定义变量
格式:
变量名:=值 (定义变量且赋初值,变量名建议大写)
(2)自动变量
$< :依赖中的第一个依赖
$^ :所有依赖
$@:目标名
(3)系统预定义变量
CC:编译器的名称,默认值是cc ,用户可以自己赋值为: eg CC :=gcc
CFLAGS:编译器的选项,无默认值,用户可以自己赋值:eg: CFLAGS:= -c -g -Wall
RM:代表删除,默认值为:rm -f,用户可以自己赋值为 eg: RM := -rf
(4)环境变量
export :添加一些指定的环境变量到整个系统环境中去
eg:
export 变量1 变量2 变量3
Linux体系结构
内核:核心组件,负责管理操作系统的执行。
进程管理,内存管理,网络管理,文件系统管理,设备驱动管理
shell:本质是一个命令行解释器,起到中间桥梁的作用,负责接收用户输入的命令,并简化其翻译提交给内核,让内核做出回应。
文件系统:
数据在设备或者分区上组织文件的一种方法(数据结构)。
分为:
磁盘文件系统(U盘),虚拟文件系统(隐藏了跨文件系统类型数据传输的细节,调用者只需要使用统一的接口,即可完成不同文件系统类型的之间的数据交互。),网络文件系统(进程间网络通信时,数据的接收以及转发)。
实用程序:每一个独立的系统,都会配备自己专属的一套程序:编辑器,编译器,浏览器,办公套件,数据库。
Linux软件包管理
方式1:离线安装
没有网络,首先本地必须存在待于安装的包文件,其次软件包之间的依赖关系需要自己建立,所以不建议使用(特殊情况)
方式2:在线安装
—》条件:有网络
检测Ubuntu系统是否有网络?
—》ping www.baidu.com
如何检查虚拟机的IP地址?
—》ifconfig
工具:APT
linux下的shell命令
命令的学习:三要素
命令名称 [选项] [参数];
总结:
命令名称不能省略
选项和参数是可选的(可有可无可多个)
不管是命令,还是代码在同一行写不完时,需要先输入空格,在输入反斜杠,再按下回车即可在下一行进行书写。
将多个命令书写在一起时,多个命令之间需要通过分号来隔开。
(1)用户切换命令
su:切换用户状态的命令
方式:
方式1:su 用户名:将用户身份切换至指定的用户状态,此时所在路径和切换之前的用户位置一样。
方式2:su - 用户名:将用户身份切换至指定的用户状态的同时,也将用户之前所在的路径切换至指定用户的家目录。
(2)常见的shell命令
env:打印环境变量以及变量对应值的命令,环境变量的值为多个时,以冒号隔开。
echo:标准输出命令,功能类似于Printf
用法:
方式1:打印指定的一个字符串
方式2:打印变量的值(注意:通过$符号完成对变量值的获取)
总结:不管是方式1还是方式2,通过echo 输出的时候,均需要书写””引起来就不会出错。
ln:创建链接文件的命令
链接文件的分类:
软链接:称为符号链接文件,以源文件的所在路径创建的一个文件,意味着软链接文件存储的是指向源文件的一条路径,类似于Windows下的快捷方式。
创建方式:
ln -s 源文件(带绝对路径) 软链接文件
硬链接:以物理编号inode编号创建的文件,意味着:
方式:
ln 源文件(相对/绝对路径) 硬链接文件
注意:源文件的写法,可以不加绝对路径,因为和路径没关系。只是源文件的一个别名。
shell特殊字符
通配符
- :匹配任意长度的内容。—》最为常用。
?:匹配含有一个长度的内容
[范围]:匹配含有范围之内的一个长度的内容
[指定范围]:匹配含有指定范围之内的一个长度的内容
[^ 指定范围]:匹配除了指定范围之外的任何一个长度的内容
管道
格式:
command1 | command2 | ..... | commandN
理解:
将前一个命令的输出作为后一个命令的输入
命令置换
格式:
Command1 ` Command2`
理解:将Command2的输出作为Command1命令的参数
重定向
概念:重新定义输出或者输入的方向为自己指定的
输入重定向:之前对于输入,默认的方向为键盘,现在可以将默认的输入方向即从键盘获取输入源改变到从比如文件中去获取一个输入源。
eg: cat:查看指定文件的内容
cat 1.c —》 cat < 1.c ( <可以省略不写 )
输出重定向:之前对于输出,默认的方向为终端,现在可以将默认的输出方向从向终端输出改变到向比如一个文件中去输出