复杂的指针
int *(*p(int))[3];
可以先跳过, 不看这个类型, 过于复杂从 p 开始,先与 () 结合, 说明 p 是一个函数, 然后进入 () 里面, 与 int 结合, 说明函数有一个整型变量参数, 然后再与外面的 * 结合, 说明函数返回的是一个指针, 然后到最外面一层, 先与[]结合, 说明返回的指针指向的是一个数组, 然后再与 * 结合, 说明数组里的元素是指针, 然后再与 int 结合, 说明指针指向的内容是整型数据。所以 p 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数。
int (* uof[3]) [4];
一个具有 3 个元素的数组, 每个元素是一个指向具有 4 个元素的int 数组的指针
函数指针
指向函数的指针
代码和数据是一样的,都需要占据一定内存,那当然也会有一个基地址,所以我们可以定义一个指针来指向这个基地址,这就是所谓的函数指针。
假设有函数:
double func(int a,char c); double (*p)(int a,char c); p=&func;
即可以定义一个函数指针。
调用函数
double s1=func(100,'x'); double s2=(*p)(100,'x');
上面两个语句是等价的。
数组元素取地址
&a[1] 等于 a+1
指针之间的赋值
指针保存的是地址,地址都是一样的大小(unsigned int 4个字节),不同类型指针之间的赋值必须强制类型转换
野指针
- 指针没有赋初值
- 指针指向的空间被释放,但指针仍然指向原来的内存单元