请问大神:C语言的复杂声明的使用场景是什么呢? 为什么会用到这么复杂的声明呢?
比如这个声明
char ((x[3])())[5];
不知道你写的是不是char ((x[3])())[5]
,如果是的话,那就有问题了(不能声明函数数组)。
关于为什么会有很多复杂的声明的应用场景,那就很多了。
举个例子,在一个图像的RGBA四个通道的数据保存在一个uchar
buffer中,现在直到图像的高和宽,怎么比较优美的取出x行y列的alpha值呢?
// 这里假设图像为 256*128
uint8_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(*)()/*给任务函数的参数*/)
实际上一般不会这么做,这只是举个例子。
7 回答5.3k 阅读
3 回答2k 阅读✓ 已解决
4 回答4k 阅读
2 回答3.9k 阅读✓ 已解决
2 回答5.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
复杂声明是特性,但是使用的时候不一定非要用得那么复杂。
char (*x[3])(int a)
意思是x是一个长度为3个单位的数组,每个单位是一个函数指针,这个函数有一个为int的参数a,这个函数返回char
那么,可能还有更复杂的,不过我就以以上这个作为例子,看下实际写代码的时候,怎么一目了然。
你问的是现实的意义,其实现实代码中绝对不少比以上更复杂的封装,但是只要善用typedef,一切都能简化到一眼看懂。