c语言函数指针 c语言函数( 二 )


类型说明符 (* 指针变量名 )();
其中 " 类型说明符 " 表示被指函数的返回值的类型 。"(* 指针变量名 )" 表示 "*" 后面的变量是定义的指针变量 。最后的空括号表示指针变量所指的是一个函数 。
例如: int (*pf)();
表示 pf 是一个指向函数入口的指针变量,该函数的返回值 ( 函数值 ) 是整型 。
下面通过例子来说明用指针形式实现对函数调用的方法 。
int max(int a,int b)
{
if(ab)return a;
else return b;
}
main()
{
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:/n");
scanf("%d%d",x,y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
}
从上述程序可以看出用 , 函数指针变量形式调用函数的步骤如下:
1. 先定义函数指针变量 , 如后一程序中第 9 行 int (*pmax)(); 定义 pmax 为函数指针变量 。
2. 把被调函数的入口地址 ( 函数名 ) 赋予该函数指针变量,如程序中第 11 行 pmax=max;
3. 用函数指针变量形式调用函数,如程序第 14 行 z=(*pmax)(x,y); 调用函数的一般形式为: (* 指针变量名 ) ( 实参表 ) 使用函数指针变量还应注意以下两点:
a. 函数指针变量不能进行算术运算,这是与数组指针变量不同的 。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的 。
b. 函数调用中 "(* 指针变量名 )" 的两边的括号不可少,其中的 * 不应该理解为求值运算,在此处它只是一种表示符号 。
3:指针型函数
前面我们介绍过 , 所谓函数类型是指函数返回值的类型 。在C语言中允许一个函数的返回值是一个指针 ( 即地址 ) ,这种返回指针值的函数称为指针型函数 。
定义指针型函数的一般形式为:
类型说明符 * 函数名 ( 形参表 )
{
…… /* 函数体 */
}
其中函数名之前加了 "*" 号表明这是一个指针型函数,即返回值是一个指针 。类型说明符表示了返回的指针值所指向的数据类型 。
如:
int *ap(int x,int y)
{
…… /* 函数体 */
}
表示 ap 是一个返回指针值的指针型函数, 它返回的指针指向一个整型变量 。下例中定义了一个指针型函数 day_name ,它的返回值指向一个字符串 。该函数中定义了一个静态指针数组 name。name 数组初始化赋值为八个字符串,分别表示各个星期名及出错提示 。形参 n 表示与星期名所对应的整数 。在主函数中 ,  把输入的整数 i 作为实参,在 printf 语句中调用 day_name 函数并把 i 值传送给形参 n。day_name 函数中的 return 语句包含一个条件表达式 ,  n 值若大于 7 或小于 1 则把 name[0] 指针返回主函数输出出错提示字符串 "Illegal day"。否则返回主函数输出对应的星期名 。主函数中的第 7 行是个条件语句,其语义是,如输入为负数 (i0) 则中止程序运行退出程序 。exit 是一个库函数,exit(1) 表示发生错误后退出程序 ,  exit(0) 表示正常退出 。
应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别 。如 int(*p)() 和 int *p() 是两个完全不同的量 。int(*p)() 是一个变量说明,说明 p 是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p) 的两边的括号不能少 。
int *p() 则不是变量说明而是函数说明 , 说明 p 是一个指针型函数,其返回值是一个指向整型量的指针,*p 两边没有括号 。作为函数说明 ,  在括号内最好写入形式参数,这样便于与变量说明区别 。对于指针型函数定义,int *p() 只是函数头部分,一般还应该有函数体部分 。

推荐阅读