C语言-指向函数的指针

函数类型  (* 函数指针变量)() ;  //指向函数的入口地址

一个函数是若干语句的集合 , 经编译后存储在函数代码存储区 , 并占有一片连续的存储空间 ,对函数指针只能用函数名赋值而无其他运算

#include<stdio.h>

int max(int x ,int y);

int main()
{
int (* p)() ;//定义p是指向函数的指针变量
int a , b , c ;

p= max ;//将函数max的入口地址赋给指针变量p
scanf("%d %d" ,&a ,&b) ;
c= (* p)(a , b) ;//用指向函数的指针变量p调用函数
printf("a = %d , b = %d , max = %d" , a , b , c);

return 0 ;
}

int max(int x ,int y)
{
int k ;
k= (x> y)? x : y ;

return k ;
}

函数名作为实际参数 :

#include <stdio.h>

int fun1(int a , int b)
{
    return a+b ;
}

int fun2(int (*q)() , int x , int y)
{
    return (*q)(x , y) ;
}

int main()
{
    int (*p)() , k ;
    p = fun1 ;
    k = fun2( p , 8 , 5 ) ;

    printf("k = %d \n" , k);   //输出 13

    return 0 ;
}

设置一个函数proc ,每次调用它会实现不同的功能 ,输入 a , b 两个数 ,第一次调用proc时,找出两者中最大者 , 第二次找出最小者 , 第三次调用求两数之差 :

#include <stdio.h>

int max(int *x , int *y);
int min(int *x , int *y);
int a_b(int *x , int *y);
int proc(int *x , int *y , int(*p)());

int main()
{
    int a , b ;

    printf("Enter a and b :");
    scanf("%d %d" , &a , &b);

    printf("a = %d \t b = %d \n" , a , b);

    printf("max(%d,%d) = " , a , b);
    proc(&a , &b , max);

    printf("min(%d,%d) = " , a , b);
    proc(&a , &b , min);

    printf("%d - %d = " , a , b);
    proc(&a , &b , a_b);

    return 0 ;
}

int max(int *x , int *y)
{
    int k ;

    k = (*x > *y) ? *x : *y ;

    return k ;
}

int min(int *x , int *y)
{
    int k ;

    k = (*x < *y) ? *x : *y ;

    return k ;
}

int a_b(int *x , int *y)
{
    int k ;

    k = *x - *y ;

    return k ;
}

int proc(int *x , int *y , int (*p)())
{
    int q ; 
    q = (*p)(x , y);

    printf("%d\n" , q);

    return 0 ;
}

一个简单的主控菜单程序 , 包括 增加 , 删除 , 显示 , 退出

#include <stdio.h>
#include <string.h>     //字符操作   
#include <stdlib.h>    //包含system函数 

void enter() ;
void delete() ;
void review() ;
void quit() ;
//void enter() , delete() , review() , quit() ;
int menu();
void (*option[])() = {enter , delete , review ,quit} ;


int main()
{
    int i ;
    while(1)
    {
        i = menu();
        system("CLS");   //清屏函数 
        
        (*option[i])();   //调用函数,执行功能 

        system("PAUSE");   //等待输入 
        system("CLS");
    }
} 

int menu()
{
    char select[] = {"1234EDRQedrq"};
    char *p , ch ;               //定义数组指针应与数组数据类型一致 

    printf("1:Enter\n");
    printf("2:Delete\n");
    printf("3:Review\n");
    printf("4:Quit\n");

    printf("Please select a number :");

    while(!(p = strchr(select , ch = getchar())))   //将找到的字符地址赋给指针变量p
    //  若没找到则 p 返回 '\0' 即 NULL , 非P 为真 执行 下列语句 
    {
        putchar('\a');     // 产生响铃声 
        printf("%c\b" , ch);  //退格回显 
    }

    return((p - select) % 4) ;   // 返回值只可能为 0 ,1 ,2 ,3  
}

void enter()
{
    printf("In  enter()");
}

void delete()
{
    printf("In delete()");
}

void review()
{
    printf("In review()");
}

void quit()
{
    printf("In quit()");
    exit(0) ;  //函数exit()使程序立即正常终止 , 通常 ,状态值 status 为 0 表示正常终止
    //status 为 非 0 时 为出现错误后终止程序  
}

 

posted @ 2016-01-07 17:28  ItsApe  阅读(231)  评论(0编辑  收藏  举报