C语言的复杂声明的使用场景是什么呢?

发布于 2022-09-03 15:31:51 字数 88 浏览 21 评论 0

请问大神:C语言的复杂声明的使用场景是什么呢? 为什么会用到这么复杂的声明呢?
比如这个声明
char ((x[3])())[5];

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

辞旧 2022-09-10 15:31:52

复杂声明是特性,但是使用的时候不一定非要用得那么复杂。

char (*x[3])(int a)

意思是x是一个长度为3个单位的数组,每个单位是一个函数指针,这个函数有一个为int的参数a,这个函数返回char

那么,可能还有更复杂的,不过我就以以上这个作为例子,看下实际写代码的时候,怎么一目了然。

typedef char func(int a);
typedef func *func_ptr;
func_ptr x[3];

你问的是现实的意义,其实现实代码中绝对不少比以上更复杂的封装,但是只要善用typedef,一切都能简化到一眼看懂。

巴黎夜雨 2022-09-10 15:31:52

图片描述
不知道你写的是不是char ((x[3])())[5],如果是的话,那就有问题了(不能声明函数数组)。

关于为什么会有很多复杂的声明的应用场景,那就很多了。
举个例子,在一个图像的RGBA四个通道的数据保存在一个ucharbuffer中,现在直到图像的高和宽,怎么比较优美的取出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(*)()/*给任务函数的参数*/)

实际上一般不会这么做,这只是举个例子。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文