这几天在看c程序设计语言第二版,在看到第五章复杂声明时,有些疑惑,在结合别人的理解上,我按自己的理解方式理解复杂声明,并附上实际的测试例子。
1.首先选取的是 char ( * ( * x ( ) ) [ ] ) ( ) ,由外至内分解,分解如下:
a..选取左边的char ( * ,右边选取 ) ( ) ,合起来就成为 char ( * ) ( ) 。这表明这是一个函数指针,该函数零参数,返回 char。删除已选的字符,剩下
( * x ( ) ) [ ]
b.选取左边的( *,右边选取) [ ],合起来就成为 ( * ) [ ] 。这表明这是一个指针数组,数组存放的是上面的所得的函数指针。删除已选的字符,剩下
x ( )
c.这里可以看出,实际x是一个函数,该函数返回上述所得的数组指针。
实际上char ( * ( * x ( ) ) [ ] ) ( ) 的含义,英文原版的说法是 x:function returning pointer to array[] of pointer to function returning char.我理解的意思是 函数X返回一个指针数组,该指针数组存放的是一组函数指针A,该函数A无参数和返回char。
借用外国的测试代码
#include <stdio.h>
char x1() { return 'a'; } // Function returning a char
char (*x2[])() = {&x1}; // Array of pointers to functions returning char
char (*(*x())[])() { return &x2; } // Function returning a pointer to the above
void main()
{
char (*x3)() = **x(); // Pointer to a function returning char
printf("This is the value: %c\n", x3());
}
2.接下来的是char ( * ( * x [ 3 ] ) ( ) ) [ 5 ],由外至内分解,分解如下:
a.选取左边的char ( *,右边选取 ) [ 5 ] ,合起来就成为char ( * ) [ 5 ] ,这是一个数组指针,该数组指针指向char[5].删除已选的字符,剩下
( * x [ 3 ] ) ( )
b.选取左边的 ( *,右边选取 ) ( ) ,合起来就成为 ( *) ( ) 这是一个无参的函数指针,该函数返回的是一个上面所得的数组指针,删除已选的字符,剩下
x[3]
c.这里可以看出x是一个有3个元素的数组,存放的元素为上面所得函数指针。
实际上char ( * ( * x [ 3 ] ) ( ) ) [ 5 ]的含义,英文原版的说法是X:array[3] of pointer to function returning pointer to array[5] of char.我理解的意思是数组X[3]存放的是3个函数指针,该函数指针返回一个数组指针,该数组指针对应的是一组char[5]的数组。
测试代码
#include <stdio.h>
char x1[][5]={"1234","abcd"};
char (*x2())[5]{return y1;}
char (*(*x[3])())[5]={x2};
int main(){
char (*(*p1)())[5]=y[0];
char *p2=(*p1)();
printf("%s\n",p2);
}