如何理解C语言中的复杂声明

Python010

如何理解C语言中的复杂声明,第1张

C语言声明的复杂性多来自于各各种类型声明的嵌套。最为典型的便是指针函数以及数组三者之间的混用。要想准确地理解复杂声明的确切含义,就需要一个清晰的条理逻辑。结合网络上的教程,修修补补完成了这篇教程。 网上的范例有很多,如:1、int (*func)(int *p);2、int (*func)( int *p, int (*f )( int*) )3、int func(void) [5]在逐个解析之前,要先说明一下解读的方法,比较著名且有效的就是“右左法则”:"The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed." “首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。” 简单来说,可以归纳为:1、先看标识符:从左往右,有小括号括起来的算作一个。2、再看右边:标识符右边有“[]”的,便为数组;有“()”的,便为函数。3、最后看左边:根据类型符确定该声明的类型,有“*”说明是指针,需注意是否有括号将“*”和类型符隔开。 以上面的声明为例:1、int (*func)(int *p); int为类型符,(*func)为标识符,且右边跟有(),说明这是函数,该函数的形参是一个整型指针(int *p)。由类型符int可知这是一个返回值为整型的函数。(*func)是一个函数,因此func就是一个指向函数的指针。因此,int (*func)(int *p)是一个以整型指针为形参,返回整型的函数指针。2、int (*func)( int *p, int (*f )( int*) )与上例较为类似,不同的只是多了一个形参,多的那个形参即为上例的声明。3、int func(void) [5]该声明实际上是一个非法的声明。func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组(即数组名只能用来赋值而不可被赋值),因此函数返回值不能为数组,该声明非法。 在实际的编程过程中,这样的复杂声明并不提倡。

存在就是有必要的.

复杂声明自然用于简单声明不好处理或者不方便处理的场景.

举个例子,在一个图像的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(*)()/*给任务函数的参数*/)

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 *)

这个~~括号都不匹配 是不打错了- _ -!

--------------------------------------------------------------------------------------------------------------

以上为小子一些不成熟的分析,欢迎各位大神拍砖指点^_^.....

-----------------------------觉得我头像可爱的点赞 !!!