去面试的时候,总是问到C语言中的怪异声明,比如指向函数的指针,指向数组的指针,指向返回类是函数指针的函数的函数指针数组,。。。。。。。反正一大堆有的你搞头了。
比如:
1, int (*p)[10];
2, int(*p)(int);
3, char* const *( * next ) ( );
4, void ( *signal( int sig, void(*func)(int) ) )(int);
5, int ( *a[] ) (int);
6, int ( *p() ) [10];
这种声明的解读规律如下:
a,找到变量名,这个应该很容易的。
b,先看变量名的 右边,
b1,如果是个(),表示这个变量是个函数声明。
b2,如果是个 [] ,表示这个变量是个数组声明。
b3,如果什么都没有,啥也不表示了
c, 再看变量名的 左边,如果有*,表示 指向....的指针,
c1,如果右边什么也没有,变量名本身是一个指针。
c2,如果右边是 [],表示数组的内容是指针。
c3,如果右边是(),表示函数的返回值是个指针。
我们现在来分析下:
1, int (*p)[10];
分析:变量名是p,p的右边没有任何东西,p的左边是一个*,表示p本身是一个指针。括弧外面修饰的是p指向的内容,修饰模式是 int XXX[10],是一个包含10个元素的数组。连起来就是,p是一个指针,指向一个数组,这个数组包含10个元素
2, int(*p)(int);
分析:同样,变量名是p,p右边什么都没有,左边是一个*,表示p本身就是一个指针。括弧外面修饰的是p指向的内容,修饰模式为 int XXX(int ),这表示一个函数名是XXX的函数。连起来就是,p是一个指针,指向一个函数,这个函数的参数是int型,返回值也是int型。
3, char* const *( * next ) ( );
分析:
4, void ( *signal( int sig, void(*func)(int) ) )(int);
分析:
5, int ( *a[] ) (int);
分析:
6, int ( *p() ) [10];
分析:
比如:
1, int (*p)[10];
2, int(*p)(int);
3, char* const *( * next ) ( );
4, void ( *signal( int sig, void(*func)(int) ) )(int);
5, int ( *a[] ) (int);
6, int ( *p() ) [10];
这种声明的解读规律如下:
a,找到变量名,这个应该很容易的。
b,先看变量名的 右边,
b1,如果是个(),表示这个变量是个函数声明。
b2,如果是个 [] ,表示这个变量是个数组声明。
b3,如果什么都没有,啥也不表示了
c, 再看变量名的 左边,如果有*,表示 指向....的指针,
c1,如果右边什么也没有,变量名本身是一个指针。
c2,如果右边是 [],表示数组的内容是指针。
c3,如果右边是(),表示函数的返回值是个指针。
我们现在来分析下:
1, int (*p)[10];
分析:变量名是p,p的右边没有任何东西,p的左边是一个*,表示p本身是一个指针。括弧外面修饰的是p指向的内容,修饰模式是 int XXX[10],是一个包含10个元素的数组。连起来就是,p是一个指针,指向一个数组,这个数组包含10个元素
2, int(*p)(int);
分析:同样,变量名是p,p右边什么都没有,左边是一个*,表示p本身就是一个指针。括弧外面修饰的是p指向的内容,修饰模式为 int XXX(int ),这表示一个函数名是XXX的函数。连起来就是,p是一个指针,指向一个函数,这个函数的参数是int型,返回值也是int型。
3, char* const *( * next ) ( );
分析:
4, void ( *signal( int sig, void(*func)(int) ) )(int);
分析:
5, int ( *a[] ) (int);
分析:
6, int ( *p() ) [10];
分析: