【1】GNU工具
- 编译工具:把一个源程序编译为一个可执行程序(gcc)
- 调试工具:能对可执行程序进行源码或汇编级调试(gdb)
- 软件工程工具:用于协助多人开发或大型软件项目的管理,如make
【2】gcc编译器
1.预处理
将头文件或者宏定义展开添加到程序代码中
注意:预处理不检查语法错误
gcc -E hello.c -o hello.i
2.编译
将程序编译成汇编文件
注意:检查语法错误
gcc -S hello.i -o hello.s
3.汇编
将汇编程序需编译生成二进制代码
gcc -c hello.s -o hello.o
4.链接
将程序运行需要的所有依赖文件链接生成一个可执行文件
gcc hello.o -o hello
-Wall:尽可能多的显示警告信息
-g : 生成gdb调试信息
【3】gdb调试工具
注意:要想使用gdb工具,那么gcc编译选项中一定要加入‘-g
eg.gcc -g hello.c -o hello
gdb hello
- 查看文件: l (每次只能打印10行数据)
- 退出gdb: q
- 设置断点 : b n(在第n行设置断点)
- 查看断点情况 : info b
- 运行代码 : r (从文件开头运行至断点处停止,断点所在行的代码不运行)
- 查看变量值: p Val(查看变量Val的值)
- 单步运行 : n或s(从断点处开始运行程序,每次运行一行代码)
- 恢复程序运行 : c
- 删除断点: del n 删除第n个断点
【4】指针
- 地址常量
- 指针变量 :存放指针(地址)的变量
* 的作用:
(1)声明变量:表示该变量是指针
数据类型
指针所指向对象的数据类型
(2)操作指针:指针解引用(取出指针所指向对象的值)
(3)指针降级:行指针--》列指针
指针运算
(1)指针加减一个n的运算
p + n : p + n*指针对象的数据类型字节长度
p - n
(2)关系运算
判断地址的大小
(3)自增自减
p++p--
++、--如果放在变量后面,允许变量先参与其他所有的运算
++、--如果放在变量前面面,变量先自增自减再参与其他的运算
注意:地址常量不能自增自减
*p++:*p--->p++;
(*p)++:先取值,然后将取出的值加1
【5】指针和数组
数组名是数组的首地址(地址常量)
二维数组:存放一维数组的数组
1.数组指针:指向数组指针
int a[2][4]
int(*p)[4];
2.指针数组:存放指针的数组
int* p[3];
【6】函数
1.传参
(1)赋值传参
修改形参的值不会影响实参的值
(2)地址传参
可以通过地址(指针)修改变量的值
2.指针函数
返回值是指针函数
定义方式:
数据类型 * 函数名(参数列表);
int* fun();
3.函数指针
指向函数的指针
函数指针变量说明的一般形式如下:
定义方式:
<数据类型> (*<函数指针名称>)(<参数说明列表>);
int (*p)(int,int);
4.函数指针数组
存放函数指针的数组
<数据类型> (*<函数指针名称>[元素个数])(<参数说明列表>);
int (*p[2])(int,int);
【7】回调函数
- 将函数名作为形式参数的函数
- 调用函数本身
【8】const
const修饰的变量是常量(只读型变量)
1.常量化指针对象
const int*
int const*
2.常量化指针变量
int* const
3.常量化指针变量及其对象
const int* const
【9】void
void型的指针变量是一种指向不确定数据类型的指针变量。它可以通过强制类型转换让该变量指向任何数据类型的对象。
一般形式为:
void *<指针变量名> ;
【10】二级指针
指向一级指针的指针