扫码关注官方订阅号
请问大神:C语言的复杂声明的使用场景是什么呢? 为什么会用到这么复杂的声明呢?比如这个声明char ((x[3])())[5];
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
复杂声明是特性,但是使用的时候不一定非要用得那么复杂。
char (*x[3])(int a)
意思是x是一个长度为3个单位的数组,每个单位是一个函数指针,这个函数有一个为int的参数a,这个函数返回char
那么,可能还有更复杂的,不过我就以以上这个作为例子,看下实际写代码的时候,怎么一目了然。
typedef char func(int a); typedef func *func_ptr; func_ptr x[3];
你问的是现实的意义,其实现实代码中绝对不少比以上更复杂的封装,但是只要善用typedef,一切都能简化到一眼看懂。
不知道你写的是不是char ((x[3])())[5],如果是的话,那就有问题了(不能声明函数数组)。
char ((x[3])())[5]
关于为什么会有很多复杂的声明的应用场景,那就很多了。举个例子,在一个图像的RGBA四个通道的数据保存在一个ucharbuffer中,现在直到图像的高和宽,怎么比较优美的取出x行y列的alpha值呢?
uchar
// 这里假设图像为 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(*)()/*给任务函数的参数*/)
实际上一般不会这么做,这只是举个例子。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
复杂声明是特性,但是使用的时候不一定非要用得那么复杂。
char (*x[3])(int a)意思是x是一个长度为3个单位的数组,每个单位是一个函数指针,这个函数有一个为int的参数a,这个函数返回char
那么,可能还有更复杂的,不过我就以以上这个作为例子,看下实际写代码的时候,怎么一目了然。
你问的是现实的意义,其实现实代码中绝对不少比以上更复杂的封装,但是只要善用typedef,一切都能简化到一眼看懂。
不知道你写的是不是
char ((x[3])())[5],如果是的话,那就有问题了(不能声明函数数组)。关于为什么会有很多复杂的声明的应用场景,那就很多了。
举个例子,在一个图像的RGBA四个通道的数据保存在一个
ucharbuffer中,现在直到图像的高和宽,怎么比较优美的取出x行y列的alpha值呢?再例如,你有一个任务调度队列,你可以把一些任务塞给它去执行。
那么它需要接受你传入的任务,通常那就是一个函数和函数的参数。
假设这个函数是一个读取文件的参数(fun1),读取完成之后这个函数要通知传入任务者或者进行下一步操作。那么这个fun1可以接受一个函数做参数,调用这个函数来告知读取已完成,进行下一步操作
实际上一般不会这么做,这只是举个例子。