zoukankan      html  css  js  c++  java
  • 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





    
    

  • 相关阅读:
    关于easyUI tree的节点属性和自定义属性
    $.messager.prompt
    SQL SERVER 查询被锁的表、解锁表
    C# 连接Oracle 11g 无需安装Oracle客户端
    Oracle 常用语句备份
    Oracle中sys和system用户的区别
    Oracle 数据库创建、表空间创建、用户创建 步骤
    Oracle 创建数据库卡死在85%
    yield return 的使用方法
    Oracle SQL Developer 查询时间格式
  • 原文地址:https://www.cnblogs.com/xcxinghai/p/3283895.html
Copyright © 2011-2022 走看看