重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
void (*signal(
成都创新互联公司是一家专注于成都网站制作、成都做网站、外贸营销网站建设和服务器托管的网络公司,有着丰富的建站经验和案例。
int signum,void(*handler)(int)
))(int);
signal为函数指针
参数signum是整形数
参数handler是一个有整型参数,返回void的函数指针
signal所指的函数
返回一个函数指针
返回的函数参数为int型,返回值为void
#includestdio.h
void fun1(){}
void fun2(){}
void fun3(){}
void fun4(){}
void fun5(){}
void fun6(){}
void fun7(){}
void fun8(){}
void call(char choice)
{
switch(choice)
{
case '1':
fun1();
break;
case '2':
fun2();
break;
case '3':
fun3();
break;
case '4':
fun4();
break;
case '5':
fun5();
break;
case '6':
fun6();
break;
case '7':
fun7();
break;
case '8':
fun8();
break;
defult:
break;
}
}
int main(void)
{
char choice[8]={0};
char ch;
int i=0;
printf("请输入你选择要运行的函数编号(1~8):");
ch=getchar();
while(ch!='\n')
{
if(ch='1'ch='8')
{
choice[i]=ch;
i++;
}
}
for(int j=0;ji;j++)
{
call(choice[j]);
}
return 0;
}
看到这样的表达式估计让不少人都“不寒而栗”了吧,其实虽然看起来复杂,但是构造这类表达式其实只有一条简单的规则:按照使用的方式来声明。
右左法则: 首先从圆括号起,然后向右看,然后向左看, 每当遇到圆括号时,就调转阅读方向,当括号内的内容解析完毕,就跳出这个括号 ,重复这个过程直到表达式解析完毕。
其实我们发现,所谓复杂指针离不开指针函数,函数指针,指针数组,函数指针这四个概念并且括号,*比较多,其实只要我们仔细分析这些看起来复杂的表达式,其实他的逻辑也是很清晰的。
使用右左法则解析复杂的表达式:
首先要找到未定义的标识符pfun,当往右看的时候遇到括号,于是调转方向,再朝相反的方向看,
1 pfun遇到了 * ,说明pfun是一个指针
2 遇到的是另外一个括号,因此说明指针所指向的是一个函数
3 然后又向相反的方向看,又遇到了 一个 说明该函数的 返回值又是一个指针*
4 说明指针所指向的函数的返回值类型的指针指向的是数组
但是右左法则确实有点麻烦,我们这样看上面这个表达式:首先 fpun是一个指向函数的函数指针 ,该函数有一个整型指针类型的参数并且 返回值也是一个指针 ,所返回的类型指向的是一个数组,并且这个 数组有10个元素 ,每个 元素是整型指针类型 。
首先找到那个未定义的标识符,就是 func
它的外面有一对圆括号,而且左边是一个 号,这说明 func是一个指针 * int (int *pInt);
然后跳出这个圆括号,先看右边,也是一个圆括号,这说明(*func)指针指向的是一个函数
这类函数具有 int 类型的形参 ,返回 值类型是 int *。
func1被一对括号包含,且左边有一个 号,说明 func是一个指针 * int (int *p, int (*f)(int *))
跳出括号,右边也有个括号,那么func是一个 指向函数的指针
这个函数具有int* 和int ( )(int*)这样的形参,返回值为int类型。
再来看一看func的形参 int (*f)(int *) ,类似前面的解释,f也是一个 函数指针 ,
指向的函数具有int*类型的形参,返回值为int
func2右边是一个 []运算符 ,说明func是一个具有 5个元素的数组 ,
func的左边有一个*,说明 func的元素是指针 ,要注意这里的*不是修饰 func的
( func2[5])指针指向 int (int *pInt) 看右边,也是一对圆括号,数组的 元素是函数类型的指针 *
func3被一个圆括号包含,左边又有一个 , 那么func3是一个指针 *
忘右看 右边是一个 []运算符号 说明 func3是一个指向数组的指针
int (* )(int *pInt) 现在往左看,左边有一个 号 ,说明这个 数组的元素是指针 *
func4指针,只向的类型是 (* (int *pInt)) 函数
函数的形参为 int * 返回值为指针
指针 result 指向的 int (*result)[5] 为数组,数组的类型为int