C语言学习笔记
2016-03-09
Linux命令相关
ls -l出来的文件列表,最前面的d代表着这是一个文件夹
文件夹d 创建者权限rwx 创建者所在用户组权限rwx 其他人r-x
drw-rw-r–
-rwxrwxr-w
echo
: 输出
echo $? :输出上一条命令的返回值
touch xxx,新建一个文件
cat
预览文本文件
|
Linux管道
grep xxx
:过滤出包含xxx的结果
ps
: 查看进程
例如:ps -e | grep ssh
查看ssh的进程
vim 命令相关
i
: 当前位置插入shift + i
: 行首插入a
: 当前位置后一位插入shift + a
: 行尾插入o
: 换下一行插入shift + o
: 换上一行插入s
: 删除光标位置的字符,并插入shift + s
: 删除当前一行,并插入control + w
切换tab
:sp xxx
: 新增一个tab窗口:wqa
: 保存所有文件并退出,a指所有文件:set nu
: 显示行号
10 dd
: 剪切当前光标行至10行的内容,p
: 粘贴
cc编译命令:
cc hello.c
: 编译hello.c文件,输入默认的a.out执行文件
cc hello.c -o main.out
: 输出执行文件名指定为main.out
c语言
include包含的<>
是指引用的是系统预装的库
自己写的用""
包含就可以
main函数中的return 0; 表示执行成功,其他值表示失败,
如果执行失败 ,&& 连接后的命令将不会被执行
如:a.out && ls ,如果a中的main函数return 0;ls将会被执行,否则不会被执行
&
: 取地址符
如果知道一个地址,则需要在这个地址前面加一个*
即可获取到该地址指向的值
如果着这个地址指向的不是数据段或者堆或者栈,而是指向代码段,编译器则认为这个地址指向的是一个函数指针(*xxx)(arg)
即可执行该函数,
这种方式通常用于写回调函数
scanf
printf
linux的流
stdin
stdout
stderr
输出流的重定向:>
覆盖模式;>>
追加模式
输入流重定向:<
例如: ./a.out < input.txt
在64位的操作系统中,指针是占8个字节的,
32位系统中的指针是占4个字节
32位的地址总线需要4个字节,64位即8个字节
Makefile
1 | math.out:max.o min.o math.c |
注意Makefile文件中的缩减使用的是tap,而不是空格
Debugger命令
n
执行下一行代码p
打印命令,如 p a
即打印a变量的值s
进入函数bt
显示函数所在栈f
切换当前所处在的函数
x/<n/f/u> <addr>
n、f、u是可选的参数,
- n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容
- f 表示显示的格式
- u 表示将多少个字节作为一个值取出来,如果不指定的话,GDB默认是4个bytes,如果不指定的话,默认是4个bytes。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
参数 f 的可选值:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
参数 u 可以用下面的字符来代替:
b 表示单字节
h 表示双字节
w 表示四字节
g 表示八字节
- 注意这里的命令执行后,默认命令就被替换,
例如:
(gdb) p record$10 = {12, 76, 48, 62, 94, 17, 32, 37, 52, 69}
(gdb) p &record$11 = (int (*)[10]) 0x8049740
(gdb) x/4uw 0x80497400x8049740 <record>: 12 76 48 62
(gdb) x/6ow 0x80497400x8049740 <record>: 014 0114 060 076
0x8049750 <record+16>: 0136 021
字符指针:存在代码段中 (不能被修改,通常用作常量)
字符数组:存在栈中
C语言只有在定义字符数组的时候才能用“=”来初始化变量,其它情况下是不能直接用“=”来为字符数组赋值的
结构体
宏
宏替换:在预处理阶段使用字符串替换的方式
不考虑语法,
常量#define M 100
宏函数,不考虑c的语法,不需要设置参数类型#define ADD(a,b)(a+b)
别名: typedef int aaa;
typedef是有作用域的,宏是全局的
共用体(联合体):让几个不同类型的变量共享同一个内存地址union