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
2
3
4
5
6
math.out:max.o min.o math.c
gcc max.o min.o hello.c -o math.out
max.o:max.c
gcc -c max.c
min.o:min.c
gcc -c min.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 0x8049740
0x8049740 <record>: 12 76 48 62
(gdb) x/6ow 0x8049740
0x8049740 <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