c语言_指针型函数

 函数指针变量 

    在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的 首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指 向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量 称为“函数指针变量”。 函数指针变量定义的一般形式为: 类型说明符 (*指针变量名)(); 其中“类型说明符”表示被指函数的返回值的类型。“(* 指针变量名)”表示“*”后面的变量 是定义的指针变量。后的空括号表示指针变量所指的是一个函数。

例如: int (*pf)(); 表示 pf 是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。 本例用来说明用指针形式实现对函数调用的方法。

int max(int a,int b)
{ 
    if(a>b)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); 4) 调用函数的一般形式为: (*指针变量名) (实参表) 使用函数指针变量还应注意以下两点: a) 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个 整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。 b) 函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在 此处它只是一种表示符号。 

指针型函数 

    所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返 回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。

定义指针型函数的一般形式为: 类型说明符 *函数名(形参表) { …… /*函数体*/ }

其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符 表示了返回的指针值所指向的数据类型。 如: int *ap(int x,int y) { ...... /*函数体*/ } 表示 ap 是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。 本程序是通过指针函数,输入一个 1~7 之间的整数,输出对应的星期名。

 main()
 { 
     int i; char *day_name(int n);
      printf("input Day No:\n");  
     scanf("%d",&i); if(i<0) exit(1);
     printf("Day No:%2d-->%s\n",i,day_name(i)); 
 } 
char *day_name(int n)
{
          static char *name[]={ "Illegalday", 
                                 "Monday", 
                                 "Tuesday", 
                                 "Wednesday",
                                 "Thursday", 
                                 "Friday",
                                 "Saturday", 
                                  "Sunday"
                               }; 
 return((n<1||n>7) ? name[0] : name[n]);
} 

本例中定义了一个指针型函数 day_name,它的返回值指向一个字符串。该函数中定义 了一个静态指针数组 name。name 数组初始化赋值为八个字符串,分别表示各个星期名及出 错提示。形参 n 表示与星期名所对应的整数。在主函数中,把输入的整数 i 作为实参,在 printf 语句中调用 day_name 函数并把 i 值传送给形参 n。day_name 函数中的 return 语句 包含一个条件表达式,n 值若大于 7 或小于 1 则把 name[0]指针返回主函数输出出错提示字 符串“Illegal day”。否则返回主函数输出对应的星期名。主函数中的第 7 行是个条件语句, 其语义是,如输入为负数(i<0)则中止程序运行退出程序。exit 是一个库函数,exit(1)表 示发生错误后退出程序,exit(0)表示正常退出。 应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如 int(*p)()和 int *p()是两个完全不同的量。 int (*p)()是一个变量说明,说明 p 是一个指向函数入口的指针变量,该函数的返回 值是整型量,(*p)的两边的括号不能少。 int *p()则不是变量说明而是函数说明,说明 p 是一个指针型函数,其返回值是一个 指向整型量的指针,*p 两边没有括号。作为函数说明,在括号内好写入形式参数,这样 便于与变量说明区别。 对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。 

猜你喜欢

转载自blog.csdn.net/sing_Hwang/article/details/84031646