指针的类型是决定存储空间的关键因素
例如:char arr[5]=[1,2,3,4,5,6]
char (*pm)[5]=&arr
因为数组的优先级·是大于*的
arr 是数组名也是首元素的地址
&arr是数组的地址,但是值也是首元素的地址
但arr表示的就是首元素的地址
区别在于地址加一后的意义不同
数组指针必须要先于*结合才会解析为指针,否则就是数组此时的*号不是解引用
一级指针是取得变量的地址
二级指针取到的事一级指针的地址
两者意义不同但是指向的地址都是变量的地址
一级指针取地址取出来还是等价于*p==&p
函数地址
函数名和&函数名两者都是函数的地址函数不存在首元素的地址
函数指针必须写上返回类型
函数指针*也得用()括起来
例如:int (*pa)(int, int)=&add
值得注意的事这里的*号始终都是标注定义指针使用
1、(*(void(*)())0)()把0强制类型转化为函数地址
这个时候解引用0则成了调用函数0地址存的函数;
2、void(*signal(int,void(*)(int))(int)
拆分int,void(*)(int)传给signal的函数参数
void(*)(int)为函数指针的声明
typedef void(*函数名)(int)这个一定要注意函数名写的位置
此时简化为 函数名(*signal(int,函数名)
函数指针可以解引用调用也可以直接调用指针
因为函数名字也是函数地址,所以直接利用指针也间接等于同直接用函数
但函数指针必须括起来
函数指针数组
int(*parr[4])(int,int)={add,ass,aee,aww}
指针数组parr的元素存的是4个函数的地址但这四个函数地址必须是相同类型的
但是c++不允许直接这样写
上图的函数指针反回类型是char*字符*