存在就是有必要的.
复杂声明自然用于简单声明不好处理或者不方便处理的场景.
举个例子,在一个图像的RGBA四个通道的数据保存在一个ucharbuffer中,现在直到图像的高和宽,怎么比较优美的取出x行y列的alpha值呢?
// 这里假设图像为 256*128uint8_t (*p)[128][4] = (uint8_t (*)[128][4])buf
// 取x行y列的alpha值
uint8_t a = p[x][y][3] // 因为RGBA,alpha在最后
再例如,你有一个任务调度队列,你可以把一些任务塞给它去执行。
那么它需要接受你传入的任务,通常那就是一个函数和函数的参数。
假设这个函数是一个读取文件的参数(fun1),读取完成之后这个函数要通知传入任务者或者进行下一步操作。那么这个fun1可以接受一个函数做参数,调用这个函数来告知读取已完成,进行下一步操作
// 通知函数void notify()
// 读取文件的函数声明
int read_file(void(*)()/*传入通知函数*/)
// 入队函数声明
void add_task(int(*)(void())/*传入任务函数*/,void(*)()/*给任务函数的参数*/)
1 pf是个函数,它的返回值是个int*,它的参数是一个函数指针,函数指针指向的函数返回值为float型,参数为int型;
2 pf是个函数,它的参数是char*,它的返回值是个数组指针,数组指针指向一个长度为5的整型数组;
3 p是个数组,数组中每个元素都是一个函数指针,函数指针指向的函数返回值为char*,参数为char*,char*;
4 pf是个函数指针,函数指针指向的函数参数是char*,它的返回值是个数组指针,数组指针指向一个长度为3的整型数组;
先来4个~~
~~~~~~继续~~~~~
char *(*a[2])(char(*)(int*),char *)
a是一个数组,数组由两个元素构成,每个元素都是一个函数指针,函数指针指向的函数返回值为char*,指向的函数的参数有两个,第一个是个函数指针,函数指针指向的函数返回值为char,参数为int*,第二个参数是char*;
int(*(*pf[3])(char*))(char *)
pf是个数组,数组由三个元素构成,每个元素是一个函数指针,函数指针的参数是char*,返回值是一个函数指针,函数指针的参数是char*,返回值是int;
char *(*(*(*(f[2])(char *))[2])(char *,char *)
这个~~括号都不匹配 是不打错了- _ -!
--------------------------------------------------------------------------------------------------------------
以上为小子一些不成熟的分析,欢迎各位大神拍砖指点^_^.....
-----------------------------觉得我头像可爱的点赞 !!!