016_函数重载与函数指针



/*
    函数重载与函数指针
    当使用重载函数名对函数指针进行赋值时
    根据重载规则挑选与函数指针参数列表一致的候选者
    严格匹配候选者的函数类型与函数指针的函数类型
*/

#if 1

void myfunc(int a)
{
    printf("a:%d \n", a);
}

void myfunc(char *p)
{
    printf("%s \n", p);
}

void myfunc(int a, int b)
{
    printf("a:%d b:%d \n", a, b);
}

void myfunc(char *p1, char *p2)
{
    printf("p1:%s ", p1);
    printf("p2:%s \n", p2);
}

//声明一个 函数类型
typedef void myTypeFunc(int a, int b); //或者 
typedef void (myTypeFunc)(int a, int b);
//myTypeFunc *myfuncp = NULL; //定义一个函数指针 这个指针指向函数的入口地址

//声明一个 函数指针 类型
typedef void(* myPTypeFunc)(int a, int b);
//myPTypeFunc fp = NULL;  //通过  函数指针类型 定义了 一个函数指针 ,

//声明一个 函数指针变量
void(* myVarPFunc)(int a, int b);

//函数指针变量的使用
void test01()
{
    //直接定义函数指针变量并初始化为指向函数myfunc,注意具有myfunc的函数原型很重要
    void(*pfun01)(int, int) = myfunc;

    //直接定义函数指针变量并初始化 
    //&是可选的,因为函数名被使用时总是由编译器把它转化为函数指针
    void(*pfun02)(int, int) = &myfunc;

    //第一种调用方式
    //函数名首先被转化为函数指针,该指针指定函数在内存中的位置 然后,
    //函数调用操作符调用该函数,执行开始于这个地址的代码 
    myfunc(11, 22);

    //第二种调用方式
    (*pfun01)(11, 22);//建议用这种方式
    //第三种调用方式
    pfun01(11, 22);
}

//使用函数类型
void test02()
{
    //使用函数类型定义函数指针
    myTypeFunc *fp;
    fp = myfunc;
    fp(1, 2);//一般用这种
    (*fp)(1, 2);

    /*{
    char buf1[] = "aaaaafff";
    char buf2[] = "bbbb";
    fp(buf1, buf2);//函数的参数类型决定了调用哪一个函数
    }*/
}

//使用函数指针
void test03()
{
    //直接使用函数指针
    myPTypeFunc Pfp = NULL;
    Pfp = myfunc;
    Pfp(3, 4);
    (*Pfp)(3, 4);
}
//使用函数指针变量
void test04()
{
    //使用函数指针变量
    myVarPFunc = myfunc;
    myVarPFunc(5, 6);//第一种调用方式
    (*myVarPFunc)(7, 8);//第二种调用方式
}
void test()
{
    test01();
    test02();
    test03();
    test04();
}
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值