c2021.7.6
常用的Linux指令:
文件相关的:
touch、rm、cp、mv、cat、more
目录相关的:
mkdir、rmdir、rm -rf、cp -frp、cd、ls
网络相关的:
ping、ifconfig/ipconfig、telent、ssh、ftp
其它:
chmod、find、grep、tar、ln
使用终端的技巧:
Ctrl+Alt+T、Ctrl+Shift+T、up/down、!cmd、Home、end、Ctrl+L、Tab
>/>>、*/?、|
vim的常用操作:
简单使用:vim filename.c、i 编辑、Esc、ZZ
模式切换:
正常 插入 i
插入 正常 Esc/Ctrl+C
正常 行底 :
行底 正常 Esc/Ctrl+C
正常模式的操作:
光标移动:hjkl、n+Enter、n+G、gg、G
删除内容:x、dw/de、dd/ndd、p/P
复制内容:yy/nyy、p/P
撤销操作:u、U、Ctrl+R
进入插入模式:a/A、i/I、o/O
插入模式的操作:
Ctrl+P、Ctrl+C、Ctrl+X
行底模式的操作:
set nu/set nonu、%s/old/new
编译器:
编译器负责把人类能看的懂的代码,翻译成计算机能看懂的二进制指令。
gcc、g++是GNU社区为了编译Linux内核代码而开发一款编译框架,能支持众多编程语言。
常用的参数:
-Wall 显示所有警告
-Werror 把警告当作错误处理,不会产生可执行程序
-o 设置编译结果的名字
-E 预处理
-s 编译生成汇编代码
-c 汇编生成目标文件
-I 指定头文件的路径
-l 额外需要链接的库
-L 库文件的路径
-g 编译时添加调试信息
C语言文件类开:
.h 头文件
.gch 头文件的编译结果
.c 源文件
.i 预处理文件
.s 汇编文件
.o 目标文件
.a 静态库文件
.so 共享库文件(动态库)
C代码变量成可执行程序的过程:
预处理:
gcc -E file.c 预处理结果显示屏幕
gcc -E file.c -o file.i 预处理结果保存到文件
编译:
gcc -s file.i 把C代码编译成汇编代码,会生成.s结尾的汇编文件
汇编:
gcc -c file.s 把汇编文件编译成二进制代码,会生成.o结尾的目标文件
链接:
gcc a.o b.o c.o 把若干个目标文件合并成可执行文件,默认生成a.out
gcc a.o b.o c.o -o xxx 设置可执行文件的名字
C语言32个关键字:
数据类型有关:
内建类型:void unsigned signed char short int long float double
自定义类型:struct union enum typedef
类型限定:auto const static volatile register extern
字节数计算:sizeof
流程控制有关:
分支:if else
开关:switch case break default
循环:for while do
跳转:goto continue return
C语言的数据类型:
char %c
bool stdbool.h true false
unsigned char 1 %hhu 0~255
unsigned short 2 %hu 0~65535
unsigned int 4 %u
unsigned long 4/8 %lu
unsigned long long 8 %llu
signed char 1 %hhd -128~127
signed short 2 %hd -32768~32767
signed int 4 %d
signed long 4/8 %ld
signed long long 8 %lld
float 4 %f
double 8 %lf
long double 12/16 %LF
运算符:
算术运算符:+ - * / %
/ % 除数不能为零,否则会产生浮点数例
关系运算符:> < >= <= == !=
运算规则与数学中的不同
常量 == 变量
逻辑运算符:&& || !
短路特性
! 比&&、||的运算级别高
赋值运算符:= += *= /= ...
三目运算符:[1]?[2]:[3];
不能使用流程控制语句,必须要有计算结果。
位运算符:& | ^ ~ <<
字节运算符:sizeof
不计算小括号中的表达式
类型转换:
由不同的数据类型字节数不同、格式不同、运算规则不同,所有只有相同类型的数据才能在一起运行,由不同组成的表达式系统会自动把不同类型的数据转换成相同类型再进行计算,这种类型转换叫自动类型转换,也叫隐式类型转换。
转换规则:
1、整型向浮点型转换
2、字节少的向字节多的转
3、有符号的几无符号的转
4、char、short 会先转换成 int
强制类型转换:(类型)数据,有丢失数据的风险,慎重使用。
流程控制:
注意:if、for、while 的小括号后不能带分号。
分支:
if
else
else if
开关:
switch(整型数据)
{
case 整型常量:语句;
break; 关闭执行开关
default: 当所有case都无法匹配成功,则打开执行开关
}
循环:
for([1]; [2]; [3])
{
[4];
}
1、给循环变量赋初值,设置循环变量的起点
2、判断循环变量,限制循环变量的终点
4、执行循环体
3、循环变量自加或自减
while(条件)
{
循环体
}
do{
循环体
}while(条件);
先执行循环体,再判断循环条件
跳转:
break 在循环语句中可以跳出循环
continue 结束本次循环
goto 在函数内,跳转到任意位置
return 结束函数执行,可以把数据存储到负责保存返回值的位置
数组:
一种批量定义变量的方式。
##### 一维数组:
把变量排成一排,通过下标访问,下标的范围:0~数量-1
初始化语法:类型 数组名[长度] = {v1,v2,v3,...};
二维数组:
把变量排成一个方阵,通过行下标+列下标访问
初始化语法:类型 数组名[行数][列数] = {
{v1,v2,v3,...},
{v1,v2,v3,...},
{v1,v2,v3,...},
...
};
变长数组:
使用变量作数组的长度参数,在编译无法确定数组的长度,当程序运行时直到执行数组的定义语句,再确定数组长度,在此之前数组的长度可以根据实际情况进行变化,这样可以节约内存。
注意:变长数组不能初始化。
进制转换与原反补:
十进制转换成二进制:
使用2对十进制数据不停的求余,直到商为0结束,记录求余的结果。
49 % 2 = 1
24 % 2 = 0
12 % 2 = 0
6 % 2 = 0
3 % 2 = 1
1 % 2 = 1
0 结束
110001
为了方便记录二进制数据,又发明的八进制和十六进制:
3位 二进制对应 1位 八进制 在C代码中以0开头的是八进制数据
4位 二进制对应 1位 十六进制 在C代码中以0x开头的是十六进制数据
10 A
11 B
12 C
13 D
14 E
15 F
原码:把数据的绝对值转换成二进制,叫做数据的原码。
补码:
正数的原码就是补码
负数的原码按位求反后加1,才是补码。
补码转换成十进制数据:
需要提前知道该补码是否有符号位,有符号时根据符号判断是否是负数,如果无符号则直接转换成十进制。
函数:
是C语言管理代码的最小单位,是一个代码模块,命名空间、栈空间是独立的。
函数声明:
返回值类型 函数名(形参列表);
1、在C语言中函数名全部小写,用下划线分隔。
2、形参列可以只写类型,没有参数的时要写void。
3、不需要返回值时,要写void。
函数定义:
返回值类型 函数名(形参列表)
{
// 尽量不要超过50行
}
#### 传参:
1、普通变量是值传递
2、数组参数是地址传递,数组会脱变成指针,需要额外增加一个参数用于传递数组的长度。
3、不要返回局部变量的地址,原因是随着函数的执行结束,局部变量会自动被释放,因此返回的是野指针。
#### 递归:
函数自己调用自己的行为叫递归,它的本质是一种带状态的循环。
使用递归可以实现分治算法、解决树结构的问题。
递归函数每调用一次,就会对自身进行拷贝(分配栈内存),这些内存可以用于传递状态、参数,但也会耗费很多内容空间和时间。
能使用循环的问题就尽量使用循环解决,不能使用循环的再考虑使用递归。
例如:汉诺塔(记录状态) 全排列(树型结构问题)只能使用递归解决。
变量的分类:
变量的属性:存储位置 生命周期 作用域
全局变量:
data 初始化过的,bss 未初始化的
整个程序的运行时期
任何位置都可以使用,其它源文件中需要声明
静态全局变量
data 初始化过的,bss 未初始化的
整个程序的运行时期
在目标文件内可以使用
局部变量
stack
函数开始执行到结束
函数内
静态局部变量
data 初始化过的,bss 未初始化的
整个程序的运行时期
函数内
进程的内存分布:
text 代码段:存储的是二进制指令、常量(字符串字面值),该内存段的权限为只读,一旦强行修改就会产生段错误。
data 全局数据段:里面存储着初始化过的全局变量、静态变量。
bss 静态数据段:里面存储着末初始化过的全局变量、静态变量,该内存段在程序执行前会被初始化为0。
heap 堆:由于程序员手动管理,该内存无法与标识符建立映射关系(无法取名字),必须与指针配合使用。
优点:够大,分配和释放可控。
缺点:使用麻烦,容易产生内存泄漏、内存碎片。
stack 栈:由系统自动管理,随着函数被调用,会自动分配内存,函数执行结束后自动释放内存。
优点:使用方便,采用栈结构方式管理安全,不会产生内存泄漏、内存碎片。
缺点:大小有限,一次使用过多可能会产生段错误,分配和释放不可控不适合长期保存数据。
类型限定符:
auto 早期用于定义临时变量(局部变量和块),C11标准中它可以用于定义自动推导类型的变量。
const
static
volatile
register
extern
typedef

浙公网安备 33010602011771号