c语言是面向过程的编程语言,而C++是面向对象的编程语言,在C++中有类这一说,类中封装了方法,对象等内容,使用时可以直接使用类来调用类中的对象和方法,但C中没有这个概念,但是可以通过构造结构体实现同样的功能。所以我们通过c语言来模拟类的功能。
通过将自定义函数指针加入到自定义的结构体中,通过调用结构体间接调用函数就可以达到目的。
例如:实现在自定义结构体中构造函数指针成员来调用对应的函数,一个函数的功能是对数组进行赋值,第二个函数是打印输出数组的内容,当然数组也作为结构体成员被定义出来,即结构体类型大致如下:
struct fun
{
int a[10];
int len;
//函数1
//函数2
};
首先确定函数1的形参和返回值类型,再定义一个指向该类型的函数指针。
typedef int*(*p)(int a[],int); //函数指针类型重命名
int* insert(int a[],int n) //函数1的实现
{
int *p=a;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
return p;
}
函数2实现步骤也一样
void (*q)(int* ,int); //指向函数2的指针类型重命名
void print(int*p,int n) //函数2的实现
{
for(int i=0;i<n;i++)
printf("%d ",*(p+i));
}
确定之后就可以确定结构体中的函数指针的定义了。
struct fun
{
int a[10];
int n;
p p1; //使用已经重命名的类型名进行定义,可以指向函数1的指针p1
q p2; 使用已经重命名的类型名进行定义,可以指向函数2的指针p2
};
最后就是在main函数中访问结构体成员来调用函数了。
#include <strings.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef int* (*p)(int a[],int) ;
typedef void (*q)(int *,int n) ;
int* insert(int a[],int n)
{
int *p=a;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
return p;
}
void print(int*p,int n)
{
for(int i=0;i<n;i++)
printf("%d ",*(p+i));
}
struct fun
{
int a[10];
int n;
p p1;
q p2;
};
int main(int argc, char *argv[])
{
int *r=NULL; //定义指针r用于接收insert函数的返回值
struct fun test; //定义结构体变量test
test.p1=insert; //访问test中的指向函数1的成员变量p1来指向insert函数
r=test.p1(test.a,10); //使用p1调用函数
test.p2=print; //访问test中的指向函数2的成员变量p2来指向print函数
test.p2(r,10); //使用p2调用print函数
return 0;
}
结果如下: