1.函数和指针

指向函数的指针保存着函数代码起始处的地址

声明一个函数指针必须声明它指向的函数的类型

创建指向函数的指针最好的方法就是将函数名替换为(*fp)

括号必须要加

void * pf(char *)//pf是一个函数返回一个指针

void (*pf)(char *)//pf是一个指针指向一个函数

函数名就是一个函数的地址

使用指针调用函数的方式有两种,

(*pf)(mis);//pf指向一个函数,那么*pf就是该函数了

pf(mis)//因为函数名也是一个指针,可以互换指针和函数名

2.应用举例

 

  1. #include<stdio.h> 
  2. #include<ctype.h> 
  3. #include<string.h> 
  4. #define SIZE 81 
  5.  
  6. char showmenu(void); 
  7. void eatline(void); 
  8. void ToUpper(char * ps); 
  9. void ToLower(char * ps); 
  10. void Transpose(char *ps); 
  11. void Dummy(char *ps); 
  12. void showString(void(*fp)(char *),char *str); 
  13.  
  14. int main(void){ 
  15.     char string[SIZE]; 
  16.     char copy[SIZE]; 
  17.     void (*fp)(char *); 
  18.     char value; 
  19.      
  20.      
  21.     puts("Enter a string"); 
  22.     while(gets(string) != NULL && string[0] != '\0'){ 
  23.         while((value = showmenu())!='n'
  24.         { 
  25.             switch(value){ 
  26.                 case 'u':fp = ToUpper;break
  27.                 case 'l':fp = ToLower;break
  28.                 case 't':fp = Transpose;break
  29.                 case 'o':fp = Dummy;break
  30.             } 
  31.             strcpy(copy,string); 
  32.             showString(fp,copy); 
  33.         } 
  34.         puts("Enter next string:"); 
  35.     } 
  36.     puts("Bye"); 
  37.     getchar(); 
  38.     return 0; 
  39. }  
  40. char showmenu(void){ 
  41.     char value; 
  42.      
  43.     puts("Enter menu choice:"); 
  44.     puts("u)uppercase l)lowercase "); 
  45.     puts("t)transposed case o)original case"); 
  46.     puts("n)next string"); 
  47.     scanf("%c",&value); 
  48.     value = tolower(value); 
  49.     eatline(); 
  50.     while(strchr("ulton",value) == NULL){ 
  51.         puts("try again"); 
  52.         scanf("%c",&value); 
  53.         value = tolower(value); 
  54.         eatline(); 
  55.     } 
  56.     return value; 
  57. void eatline(void){ 
  58.      while(getchar() != '\n'
  59.          continue
  60. void ToUpper(char * ps){ 
  61.      while(*ps){ 
  62.          *ps = toupper(*ps); 
  63.          ps++; 
  64.      } 
  65. void ToLower(char * ps){ 
  66.      while(*ps){ 
  67.          *ps = tolower(*ps); 
  68.          ps++; 
  69.      } 
  70. void Transpose(char *ps){ 
  71.      while(*ps){ 
  72.          if(islower(*ps)){ 
  73.              *ps = toupper(*ps); 
  74.          } 
  75.          else if(isupper(*ps)){ 
  76.              *ps = tolower(*ps); 
  77.          } 
  78.          ps++; 
  79.      } 
  80. void Dummy(char *ps){ 
  81.      } 
  82. void showString(void (*fp)(char *),char *str){ 
  83.      (*fp)(str); 
  84.      puts(str);