• C语言结构体中的函数指针与函数


    1、函数指针

    一般的函数指针可以这么定义:


    int(*func)(int,int); 

    表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数:

    int add2(int x,int y)
    {
        return x+y;
    }

    那么在实际使用指针func时可以这样实现:
    func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同
    printf("func(3,4)=%d\n",func(3,4));

    事实上,为了代码的移植考虑,一般使用typedef定义函数指针类型.
    typedef int(*FUN)(int,int);
    FUN func=&add2; 
    func();
    2、结构体中包含函数指针其实在结构体中,也可以像一般变量一样,包含函数指针变量.下面是一种简单的实现.
    #include "stdio.h"
    struct DEMO
    {
        int x,y;
        int (*func)(int,int); //函数指针
    };
    int add2(int x,int y)
    {
        return x+y;
    }
    void main()
    {
        struct DEMO demo;
        demo.func=&add2; //结构体函数指针赋值
        printf("func(3,4)=%d\n",demo.func(3,4));
    }
    上面的文件保存为mytest.c,在VC6.0和gcc4中编译通过.


    3、结构体中的函数
    既然C++在介绍类的时候说过,类是取代结构体的。可见结构体的功能并非我们平时用到的这么简单,没有太多人知道结构体中也可以有自己的函数成员。
    举个例子:
    #include "stdio.h"
    struct DEMO
    {
        int m;
        DEMO(int k) //构造函数
        { 
            this->m=k;
            printf("after init,m=%d\n",m);
         }
        void func()//一般函数
        {
             printf("function of struct.\n");
        }
    };
    
    void main()
    {
        struct DEMO demo(33);
        demo.func();
    }
    保存为mytest1.c , VC6.0和gcc编译都会出错。这可能说明标准C是不支持结构体包括函数成员形式的(因为后缀.c使得VC或gcc选择c编译器)。 但是如果将文件后缀改为.cpp(也就是选择c++编译),就不再有错误了,得到结果:
    after init,m=33
    function of struct. 
    也就是说,在C++中允许结构体包含函数成员,而标准C不支持。 进一步发现,c++中甚至允许结构体中含有构造函数、重载、public/private等等.这样看来,结构体真的与类越来越靠近相似了!

    C++扩充了结构体的功能。但C++中为了介绍面向对象的类,却淡化了同样精彩的结构体。当我们写一些小程序而觉得没有必要去构造类的时候,选择结构体确实会方便很多。


    推荐相关一篇博文

    http://blog.csdn.net/bit_x/article/details/5658137





    
    

  • 相关阅读:
    超级小白使用pip安装第三方库的正确姿势
    selenium+python自动化测试--解决无法启动IE浏览器及报错问题
    microsoft edge浏览器安装驱动
    超详细MySQL安装及基本使用教程
    Navicat15最新版本破解 亲测可用!!!
    Ubuntu 16.04安装JMeter测试工具
    JMeter_Ubuntu上安装jmeter
    韩国vps推荐-kdatacenter
    全栈之js入门篇
    Web前端之CSS_day5
  • 原文地址:https://www.cnblogs.com/xcxinghai/p/3283895.html
Copyright © 2020-2023  润新知