学习和使用C语言近十年了但对C语言的复杂指针依然有些迷糊索性花点时间分析一下,下面是一些心得,希望对读者有所帮助
取The C Programming Language中的两个例子以分析
char (*(*x())[])();
char (*(*x[3])())[5];
若直接让我们说出这两个x分别是什么意思往往会有一些困难, 这里我们可以使用代入法(暂且叫代入法)来分析
分析结果转述原则:
左端=右端(比如下面的Y=*x()中Y为左端, *x()为右端)
若右端为数组则左端可被看作右端的其中一个元素
若右端为函数则左端可被看作右端函数的返回值
直到无嵌套为止
分析步骤:
1.取最内的元素组合作欲被代入项( 如下面的*x() )
2.对欲被代入项做分析解释( 如对*x()进行解释:x是一个返回一个指针的函数 )
3.生成新的分析语句 ( 如 char (*(Y)[])(); )
4.精简新生成的分析语句( 如char (*(Y)[])();为char (*Y[])(); )
5.递归进行如上操作直到分析语句中无嵌套存在为止
6.根据分析转述原则转述出结果
示例分析如下:
char (*(*x())[])();
令Y=*x()
x为一函数此函数返回一个指针
有如下:
char (*(Y)[])();
即char (*Y[])();
其中*Y[]为一指针数组 其中每一项为一指针
令Z = *Y[]
则有:char (Z)();
即 char Z()
其中Z为一个函数该函数返回一个字符
根据转述原则得结果如下:
x是一函数,该函数返回一个指针,该指针指向一个指针数组,该数组的每一项为一指针,这些指针中每一个指向一个函数,这些被指向的函数返回一个字符
修饰如下:
x是一个函数,该函数返回一个指针数组,其中每一项指向了一个函数,被指向的函数返回一个字符
第二个:
char (*(*x[3])())[5];
*x[3] x为一个指针数组其中每一项为一指针
令Y = *x[3];
得:char (*(Y)())[5];
即:char (*Y())[5];
*Y() Y为一函数该函数返回一个指针
令: Z = *Y()
得:char Z[5];
Z是一个含5个字符的字符数组
根据转述原则得出结果如下:
x是一个指针数组其中每一项为一个指针, 这些指针中每项指向一个函数, 被指向的函数返回一个指针, 被返回的指针指向一个含有5个字符的字符数组
修饰如下:
x是一个指针数组, 其中的每一元素指向一个返回一个包含5个字符的字符数组的函数