学习内容:
- shell命令
- shell脚本
- C高级(结构体、共用体、枚举、函数指针、指针函数、自定义头文件、make工程管理)
day1
- 结构体
- 概念
一类相关事物属性的集合,是一种自定义的数据类型
-
- 定义
struct 结构体名
{
属性1;
属性2;
......
属性n;
};
描述一个人的姓名、年龄
struct people
{
char name[20];//姓名
int age;//年龄
};
定义了一个结构体,结构体的数据类型为(struct people)struct 结构体名
-
- 初始化
int a =10;//初始化 数据类型 变量名 = 初值;
int a;
a = 10;//赋值
数据类型 变量名 = {............};
struct people pe = {“zhangsan”,18};
-
- 访问
- 通过结构体变量来访问
结构体变量.成员
案例:将结构体的值赋值给另一个结构体
- 通过结构体指针来访问
指针变量名->成员
整型指针:指向整型的指针
数组指针:指向数组的指针
结构体指针:指向结构体的指针
数据类型 *指针变量名;
struct people * p = NULL; sizeof(p) = 4byte
-
- 字节对齐
一次性分配多少个字节
自然对齐方式(32OS):
int:4字节对齐
short:2字节对齐
float:4字节对齐
double:占8个字节,分配的时候还是按4字节分配,分配两次
char:1字节对齐
选成员中最大的那个对齐
节省结构体空间的办法:
- 将数据类型大的放到最前面
- 位域/位段
未优化之前:
优化之后
-
- 结构体的嵌套
作业:
- 定义一个结构体,描述学生的姓名、年龄、三门成绩,实现输入输出
- 编写一子函数,查找指定字符在字符串中第一次出现的地址
- 编写一子函数,查找指定字符在字符串中最后一次出现的地址
1.7 给结构体取别名
方式1:
方式2:
注意:用的最多的就是方式2
1.8 结构体数组
概念:元素为结构体的数组
数据类型 数组名[元素个数];
Stu stu[3];
day2
- malloc函数
头文件:#include <stdlib.h>
void *malloc(size_t size); //void *:任意类型的指针
函数功能:申请空间
参数:要申请的空间的大小
返回值:成功返回申请到的空间的首地址,失败返回NULL
注意:(1)malloc申请到的空间是没有名字的
(2)malloc申请到的是一片连续的内存空间
void free(void *ptr);
函数功能:释放空间
参数:申请到的空间的首地址
//描述一个学生的姓名、年龄、三门成绩
#define N 20
#define M 3
#define SIZE 3
typedef struct student
{
char name[N];//姓名
int age;//年龄
float scores[M];//三门成绩
}Stu;
用malloc申请SIZE个Stu这么大的空间
- memset
头文件:#include <string.h>
void *memset(void *s, int c, size_t n);
函数功能:重置内存空间
参数1:要重置的内存空间的首地址
参数2:要重置的值
参数3:要重置的内存空间的大小
案例:
- 对ps指向的空间进行输入输出(用子函数的形式实现)
- 求年龄最大人的首地址
- 根据年龄进行排序
- 根据姓名进行排序
- 根据三门成绩总和进行排序
- 自定义头文件
.h文件
“” :编译器从用户的工作路径搜索头文件
<> :编译器从标准库路径(/usr/include)搜索头文件
- 文件编译
作用:防止头文件重复定义
#ifndef 文件名(将文件名大写,所有的.换成_)
#define 文件名
#endif
day3
- gcc工作原理
gcc的编译流程:预处理(处理以#开头的文件)、编译(生成了汇编语言)、汇编)(将汇编语言转成机器代码)、链接(与其它机器代码整合,生成可执行的二进制代码)
方法1:
预处理:gcc -E main.c -o main.i
编译:gcc -S main.i -o main.s
汇编:gcc -c main.s -o main.o
链接:gcc main.o -o main
方法2:
将gcc的前四步合四为一:gcc main.c -o main
- 多文件编译(解决单独编译出错的问题)
2.1 将gcc的前三步合3为1
gcc -c stu.c -o stu.o
gcc -c io.c -o io.o
gcc -c sort.c -o sort.o
gcc -c sumScores.c -o sumScores.o
gcc -c swap.c -o swap.o
gcc -c calPmaxAge.c -o calPmaxAge.o
2.2 将所有的.o文件链接生成可执行文件
gcc stu.o io.o sort.o sumScores.o swap.o calPmaxAge.o -o stu
- make工程管理
make命令会在当前路径下找一个叫做Makefile(M大写或小写都可以)的文件
3.1 Makefile命名规范
目标文件1:依赖文件1
(Tab键)依赖文件1如何生成目标文件1
目标文件2:依赖文件2
(Tab键)依赖文件2如何生成目标文件2
注意:
- 如果两个目标之间没有联系,默认执行目标文件1
- 一个Makefile中可以有多个目标
- 调用make命令时,必须指定要执行的目标,如果没有指定目标,默认执行目标文件1
注意:make之后会在构建yyds之前,先构建test
3.2 解决假目标
在clean前面加上.PHONY
注意: .PHONY必须使大写
3.3 预定义变量
CC:C编译器的名称,默认为CC
CFLAGS:c编译器的选项,无默认值
RM:程序删除的名称,默认为rm -rf
3.4 自定义变量
OBJ:用于存放可执行文件的名称
OBJS:所有的目标文件
3.5 自动变量
$@:表示目标文件
$^:表示所有的依赖文件
$<:表示第一个依赖文件
此处的$^ 指的是$(OBJS)
3.6 变量定义的方式
3.6.1 递归方式 VAR=var
注意:后面的值会影响前面的结果
3.6.2 简单方式 VAR:=var
3.7 嵌套Makefile
bin(可执行文件)、include(.h文件)、src(*.c文件)、obj(*.o文件)
(1)编写总控Makefile、书写自定义变量和预定义变量
(2)编写src中的Makefile,将所有的.c文件生成.o文件,并将所有的.o文件移动到obj目录中
- 编写obj中的Makefile,将所有的.o文件编译生成可执行文件,并将可执行文件移动到bin目录中
$<:表示第一个依赖目标,也就是$(OBJ)
此处的假目标ALL ,依赖于$(OBS)
(5)先执行src中的Makefile(make -C src),再执行obj中的Makefile(make -C obj)
Make -C $@ 是一句嵌套makefile的语法,在一些大的工程中,我们会把
这是一句嵌套 makefile 的语法,在一些大的工程中,我们会把我们不同模块或是不同
功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的 Makefile,
这有利于让我们的 Makefile 变得更加地简洁,而不至于把所有的东西全部写在一个
Makefile 中,这样会很难维护我们的 Makefile,这个技术对于我们模块编译和分段编译有
着非常大的好处。
- 枚举
作用:使程序变得更加语义化
- 共用体+大小端
特点:所有成员共用同一块首地址(大小有成员中最大的那个决定)
判断是大端序还是小端序
方法1:
方法2:
day4
- 递归
给计算机制定规则,自己调用自己
5!
5*4! return 5 * 24
4*3! return 4 * 6
3*2! return 3 * 2
2*1! return 2 * 1
1! return 1
案例:实现斐波那契数列(求前10项)
1 1 2 3 5 8 13 21
- 函数指针
定义一个指向int的指针:int *
定义一个指向char的指针:char *
定义一个指向数组的指针:int (*p)[3];
定义一个指向结构体的指针
struct student
{
char name[20];
int age;
};
struct student *ps = NULL;
定义一个指向函数的指针:
int add(int m,int n); //数据类型 int (int,int)
int (*p)(int,int) = NULL;//数据类型 int (*)(int,int)
案例:定义一个函数指针,该函数的返回值为float,有一个参数,该参数的数据类型为float
float (float)
float (*p)(float) = NULL;
案例2:定义一个函数指针数组,该数组有4个元素,每一个元素都是一个函数指针,该函数的返回值为int,参数有两个,分别为int型
int (*p[4])(int,int);
- 指针函数
返回值为指针的函数
- Linux的发展史
- shell
作用:负责用户和内核之间的交互
shell命令、shell、shell脚本的本质区别
shell命令:用户向系统内核发出的控制请求
shell:将用户命令解析为操作系统能识别的指令,实现用户与操作系统之间的交互
shell脚本:一堆命令的集合
5.1 shell的类型
Bourne Shell: 最早的Shell
C Shell
Ksh
Z Shell
Bourne-again shell(bash)
5.2 shell命令
命令 [选项] [参数]
注意:[]表示可以省略
选项:功能
参数:要操作的对象
注意:
- 一条命令的三要素之间要用空格隔开
- 若将多个命令书写在一行,用;将命令隔开
(3)如果一条命令不能在一行写完,用反斜杠(\)表明该命令未结束
5.3 用户系统相关命令
1、用户切换命令
su - 用户名
注意:用户的工作路径以及环境变量都会发生改变
注意:
(1)工作路径及其环境变量都未发生改变
(2)一般情况下不要切换成root用户,要使用root用户在最前面添加sudo
2、系统管理命令
ps:显示当前系统中该用户运行的进程列表
ps -ef:查看所有进程及其(PID)进程号
ps -aux:除了-ef显示的内容外,还会显示cpu的内存占用率、进程状态
top:动态显示系统中运行的程序
kill:发送信号给指定的进程
kill -l:列出所有可用的信号名称
3、磁盘相关命令
free:查看当前系统内存的使用情况
df:查看文件系统的磁盘占用情况
du:统计目录或文件所占磁盘空间的大小
fdisk -l:列出文件系统的分区情况
注意:必须使用root权限
4、文件、目录相关命令
Linux下有7中文件类型:
-:普通文件
d:目录文件
b:块设备文件
c:字符设备文件
p:管道文件
l:链接文件
s:套接字文件(socket文件)
4.1 chmod
作用:改变文件的访问权限
-rw-rw-r-- 1 linux linux 399 12月 1 18:24 fun_p.c
注意:第一个字母:表示文件类型
rw- rw- r--
文件拥有者 用户所在组 其他人
修改文件权限的方式:
方式1:
u:文件拥有者
g:所属的用户组
o:其他人
a:所有人
+:表示增加权限
-:删除权限
=:设置权限
方法2:
注意:有权限用1表示,-表示没有权限,用0表示
rw- rw- r--
文件拥有者 用户所在组 其他人
110 110 100
6 6 4
-wx r-x rwx
011 101 111
4.2 chown
作用:修改文件所有者和组别
注意:必须使用root权限
修改文件所属用户:
修改文件所属组:
同时修改用户和组
4.3 chgrp
作用:修改文件所属组
4.4 grep
作用:在指定的文件中搜索特定的内容
grep 字符串 文件
-n :显示行号
4.5 查看文档
cat :适合看比较短的文档
more:适合看比较长的文档(按回车向下翻一行,空格向下翻一页,q退出)
less:加强版的more(回车向下翻一行,空格向下翻一页,支持上下箭头,q退出)
4.6 find
作用:在指定目录中搜索文件(若省略路径,默认为当前目录)
find -name 文件名
4.7 alias
作用:起别名(一次性的),想要永久生效的话添加到.bashrc文件中
5、特殊符号
` `:当作命令来处理
|:管道(一般不单独使用),将前一个命令的输出作为后一个命令的输入
通配符:
*:匹配任意长度的字符串(任意个字符)
?:匹配一个长度的字符(任意一个字符)
[…]:匹配其中指定的一个字符
[-]:匹配指定一个字符范围
[^…]除了其中指定的字符,均可匹配
> :输出重定向,如果文件不存在则新建,如果文件存在覆盖文件中内容
>>:追加重定向,如果文件不存在则新建,如果文件存在则追加在文件的末尾
wc -c :统计有多少个字符
wc -l :统计有多少行
< file:输入重定向,将file文件重定向为输入源
- 或&> :将产生的错误信息输出到文件中
- 硬链接和软链接
硬链接:利用Linux中为每个文件分配的物理编号,建立链接
创建硬链接:
软链接(符号链接):利用文件的路径名来建立链接
创建软链接:
区别:
硬链接会在用户选定的位置上生成一个和源文件大小相同的文件
软链接会在用户选定的位置上生成一个镜像文件,不会重复占用磁盘空间(平时使用最多的就是软链接)
相同点:
ln命令会保持每一处链接文件的同步性,不论改动了哪一处,其它的文件也会发生相同的变化
5.4 用户管理命令
相关配置文件
- /etc/passwd 系统能够识别的用户清单
- /etc/shadow 加密的用户清单
- /etc/group 组的名称和组中的成员列表
1、创建用户
sudo adduser 用户名
2、删除用户:
sudo deluser --remove-home 用户名
注意:删除的时候连同用户的主目录一起删除
3、修改用户密码
sudo passwd 用户名
- 创建组
sudo groupadd 组名
- 修改用户所属组
sudo usermod -g 目标组 要修改的用户
- 删除组
sudo groupdel 组名