结构体的定义
Strcut--->用来声明这是一个结构体
Struct +结构体名
{
数据1;
数据2;
......
};
内部的数据类型全部由个人自己进行定义,用户创建的结构体作为一个数据类型而存在
结构体访问内部成员
结构体定义好只是一个数据类型,如果要访问内部的成员,需要用到结构体变量或者结构体指针。
结构体变量
Tyepdef重命名
Typedef int int_t;
结构体指针
通过结构体数据类型来定义结构体指针
结构体嵌套
结构体是一个复合的数据类型,内部的成员是简单的和复杂的数据类型,但是同时还可以包括结构体
Struct people
{
Char name[20];
Int age;
};
Struct student
{
Int score;
};
现在将这两个结构体进行嵌套
Struct people
{
Char name[20];
Int age;
Struct student s; //struct student *s;如果使用指针,一定会有一个学生类型的结构体变量
};
计算结构体的大小
Struct people
{
Char name[29];
Int age;
Double height;
}
在计算结构体大小的时候,先看结构体内部成员的数据类型有没有超过4个字节,如果没有,就按照最大的数据类型进行对齐,如果超过4字节,就按照4字节对齐。
以空间换时间
结构体数组
数组:同一类型元素的集合。
结构体数组:是一个数组,只不过数据的类型是结构体类型
Struct people
{
Char name[20];
Int age;
};
Struct people a,b,c;
Struct people Arr[3] = {{“aa”,1},{“bb”,1},{“cc”,1}};
}};--->结构体数组
访问内部元素:arr[0].name;arr[0].age;
- 变量的数据类型---》去掉变量名
函数
返回值 函数名(形参)
{
结构;
}
返回值:
- 库函数,系统调用,接收程序执行的结果
- 判断函数调用是否成功
- Return 0;主函数结束
函数的本质:存在于内存上的一段二进制代码
函数名:二进制代码的入口地址
共用同一片内存空间
Union a
{
Int a;
Char b;
Short c;
};
#include <stdlib.h>
void *malloc(size_t size);
在堆区申请空间
参数:申请的空间大小
返回值:成功返回空间首地址,失败返回NULL
因为malloc的返回值是void *,所以在申请空间成功之后,根据所申请到的空间进行强制类型转换
Int * p= (int *)malloc(sizeof(int)*5);
#include <string.h>
void *memset(void *s, int c, size_t n);
作用:清空空间(任何空间)
参数1:空间的首地址
参数2:用来清空空间的字符
参数3:清空空间的大小
Memset(p,0,sizeof(int)*5);
void free(void *ptr);
清空空间
参数:空间的首地址
void *realloc(void *ptr, size_t size);
参数1:空间的首地址
参数2:扩容的大小
返回值:扩容后的空间首地址
如果malloc之后的放不下,那么重新开辟空间进行存放,空间的首地址会改变,原本malloc的内容会被复制
如果放得下,那么就在malloc空间之后进行开辟,空间首地址不变
枚举
枚举内部的元素相当于给数字起别名。
#define M 4--->宏定义
Typedef int int_t;
enum A
{
malloc_ok,
Input_ok,
Output_ok,
};
递归函数
在子函数的内部,自己调用本身的子函数
Int digui(int sum)
{
If(1 == sum)
{
Return 1;
}
}
Main()
{
Digui(100);
}
For(i=0;i<100;i++)
一个函数具有的功能,需要不断地进行更新,那么就可以写成递归函数(所要实现的功能复合一定的规律)
命令表
预处理 gcc -E 1.c -o 1.i 头文件展开,去掉注释,发生宏替换
编译 gcc -S 1.i -o 1.s
汇编 gcc -c 1.s -o 1.o
链接 gcc 1.o -o 1
结构体
Int double
结构体是自定义的数据类型
Struct lion
{
Char name[20];
Struct tager ta; /*ta
};
Struct lion l;
可以通过结构体数据类型定义结构体变量和结构体指针
结构体数组
一片连续的空间,内部数据是结构体类型
Typedef Struct student
{
Char name[20];
Int age;
}STU;
STU s[5];
S[0]~s[4]
For(i=0;i<5;i++)
{
Scanf(“%s”,s[i].name);
}
SHELL
外壳,保护,跟外界交互的桥梁
这个是命令行提示符,需要在这里输入命令
执行命令之后,系统会给出相应的操作--->交互
Shell在系统当中叫命令行解释器,在/bin里面有所有的命令。
将在命令行提示符输入的字符串,去/bin目录下找同名的字符串,如果找到,那么就进行对应的操作,如果没有 command not found(去/bin找文件,而不是翻译成01二进制)
Bash是一个进程,打开一个终端就会有一个bash产生
查看当前所有运行的进程 ps -aux
Cat
在终端上查看当前文件的内容
Head/tail + 文件名 查看文件头/尾 十行的内容
More/less
More和cat相似 less之后会显示当前文件的内容,不会显示命令行提示符
Grep 查找(查找已知文件内部的内容)
Grep+ 参数+需要查找的内容 + 路径/文件名
参数
-n:显示所查找的内容
-v:显示除了所查找的内容之外的所有内容
-c:显示查找内容的行数
-R:查找内容的行数,并标红
Find + 路径 + -name + 文件名---》显示路径下所有查找的同名文件
查找命令具体的用法: man 1 命令名称
数字标记法
Chmod + 权限 + 文件名 权限:000~777,但是文件的权限要给奇数位减1,所以是666
字符标记法
用户:u
用户组:g
其他用户组:o
所有:a
Chmod u+x 1.c --->给用户增加可执行的权限
Chmod a-r 1.c ---> 给所有用户都取消可读的权限
临时修改( 绝对路径修改)
Export PATH=/home/linux/23091:${PATH}--->${PATH}
临时修改实在某一个终端上进行的,取消临时修改只需要关闭修改过的终端
永久修改
修改配置文件 ~/.bashrc
拉到最后一行,添加 临时修改PATH的命令
再修改的终端上查看PATH,不会显示修改后的结果,但是重新打开终端之后,PATH会变成修改过的PATH
软转义和硬转义
对于env来讲(PWD)
软转义:输出特定字符内部的内容 echo $PWD echo “${PWD}”--->两个意义相同,都输出/honme/linux
硬转义:输出特定的字符 echo ‘${PWD}’ echo ‘$PWD’---->${PWD}/$PWD
管道 |
Command 1 | command 2 | ......| command n
将管道前的一个命令的输出,当作后一个命令的输入
``命令置换的符号
Command1 `command2`
将后一个的输出当作前一个的参数
重定向
标准输入:stdin
标准输出:stdout
输入重定向:<
输出重定向:>
一般不使用输入重定向
为什么需要使用输出重定向?
将文件的内容可以快速的输入到另一个文件当中
>:目标文件不存在会创建,如果源文件不存在并且目标文件有内容,会清空目标文件(覆盖)
>>:追加模式,每一次重定向之后都会追加到目标文件原文本的后面。如果源文件不存在,使用>>,并不会清空目标文件原本的内容
2>:将信息重定向到目标文件,不会出现内容,目标文件不存在会创建。如果源文件不存在,目标文件会存放错误信息
2>>:以追加的方式保存错误信息,正确信息不会覆盖错误信息
&>:保存正确和错误信息,会覆盖
&>>:保存正确和错误信息,会追加
shell脚本的写法
- 先创建一个后缀名为.sh的文件
- 声明解释器,书写代码
- 更改文件的权限为可执行 chmod u+x XXX.sh
- 运行 ./XXX.sh
.sh文件第一行只能书写#! /bin/bash
$@,$*:去掉可执行文件之后,剩余的内容
$#:去掉可执行文件之后,剩余的内容的个数
$?:上一行代码的瑞出状态,正常退出0
结构性语句
结构特性语句和测试命令一般同时使用
If 命令
then
命令表
Elif 命令
Then
命令表
。。。
Else
Then
命令表
fi
文件名一定是一个字符串,判断文件是否存在,用-n
判断文件是否存在并且长度不为零 -s
一个字符串可能是文件名,也可能是普通的字符串,首先要判断字符串是否存在,然后在字符串存在的基础上,判断这个字符串到底是文件名还是文件夹名
Case
Case 变量 in
模式)
命令表 ;;
模式)
命令表 ;;
模式)
命令表 ;;
模式)
命令表 ;;
.........
For
for 格式 in 格式表
do
命令表
Done
While
while 命令
Do
命令表
Done
当while的测试命令为真,或者直接写true,那么while就是一个死循环。
SHELL函数
SHELL函数也是函数,但是SHELL是一个弱类型,没有数据类型的区分,所以SHELL
函数没有形参
add()
{
Echo “aaaa”
Echo “bbbb”
}