1.函数和指针
指向函数的指针保存着函数代码起始处的地址
声明一个函数指针必须声明它指向的函数的类型
创建指向函数的指针最好的方法就是将函数名替换为(*fp)
括号必须要加
void * pf(char *)//pf是一个函数返回一个指针
void (*pf)(char *)//pf是一个指针指向一个函数
函数名就是一个函数的地址
使用指针调用函数的方式有两种,
(*pf)(mis);//pf指向一个函数,那么*pf就是该函数了
pf(mis)//因为函数名也是一个指针,可以互换指针和函数名
2.应用举例
- #include<stdio.h>
- #include<ctype.h>
- #include<string.h>
- #define SIZE 81
- char showmenu(void);
- void eatline(void);
- void ToUpper(char * ps);
- void ToLower(char * ps);
- void Transpose(char *ps);
- void Dummy(char *ps);
- void showString(void(*fp)(char *),char *str);
- int main(void){
- char string[SIZE];
- char copy[SIZE];
- void (*fp)(char *);
- char value;
- puts("Enter a string");
- while(gets(string) != NULL && string[0] != '\0'){
- while((value = showmenu())!='n')
- {
- switch(value){
- case 'u':fp = ToUpper;break;
- case 'l':fp = ToLower;break;
- case 't':fp = Transpose;break;
- case 'o':fp = Dummy;break;
- }
- strcpy(copy,string);
- showString(fp,copy);
- }
- puts("Enter next string:");
- }
- puts("Bye");
- getchar();
- return 0;
- }
- char showmenu(void){
- char value;
- puts("Enter menu choice:");
- puts("u)uppercase l)lowercase ");
- puts("t)transposed case o)original case");
- puts("n)next string");
- scanf("%c",&value);
- value = tolower(value);
- eatline();
- while(strchr("ulton",value) == NULL){
- puts("try again");
- scanf("%c",&value);
- value = tolower(value);
- eatline();
- }
- return value;
- }
- void eatline(void){
- while(getchar() != '\n')
- continue;
- }
- void ToUpper(char * ps){
- while(*ps){
- *ps = toupper(*ps);
- ps++;
- }
- }
- void ToLower(char * ps){
- while(*ps){
- *ps = tolower(*ps);
- ps++;
- }
- }
- void Transpose(char *ps){
- while(*ps){
- if(islower(*ps)){
- *ps = toupper(*ps);
- }
- else if(isupper(*ps)){
- *ps = tolower(*ps);
- }
- ps++;
- }
- }
- void Dummy(char *ps){
- }
- void showString(void (*fp)(char *),char *str){
- (*fp)(str);
- puts(str);
- }
转载于:https://blog.51cto.com/fanaticssk/830064