C语言中,在结构体成员列表中添加函数

目录

一.前言

二.C中结构体的几种基本用法

2.1.C中结构体基本说明

2.2.C中常见的结构体(结构体变量)的定义的几种方法

2.3.含函数名的结构体的定义和变量的定义


一.前言

前几天在看一个代码的时候,发现在结构体成员中出现了函数名,半天没有看懂,感觉有一点奇怪,后来查了一点资料,这里记录一下。

二.C中结构体的几种基本用法

2.1.C中结构体基本说明

        C中结构体的基本结构如下所示:

struct 结构体名{
    成员列表,
};

        struct是定义结构体的关键字,后面是你所定义的一种结构体的类型名,等效为int,float等C语言自带的数据类型名,成员列表是结构体所包含的成员。

2.2.C中常见的结构体(结构体变量)的定义的几种方法

第一种:只定义和声明一种新的结构体类型

/* 结构体的定义和声明 */
struct Student{
    char name;
    int  year;
    int  id;
    float fraction;  // 分数
};


/* 结构体变量的定义 */
struct Student zhangsan;
struct Student lisi, wangwu;

这种结构体的定义和声明中,需要注意的地方就是在结构体变量的声明和定义中,不要忘记了关键字struct。

第二种:定义和声明结构体的同时,定义一个结构体变量

/* 结构体类型的定义和声明,同时定义了一个这种类型的结构体变量lisi */
struct Student{
    char name;
    int year;
    int id;
    float fraction;
}lisi;


/* 结构体变量的定义和声明 */
struct Student zhangsan;  // 方法一
zhangsan.id = 100;
lisi.id = 200;  // 方法二

这种与第一种的区别在于定义和声明结构体类型名的同时,定义了一个此类型的结构体变量lisi。

第三种:直接定义具有某种结构的结构体变量

/* 直接定义结构体变量 */
struct {
    char name;
    int year;
    int id;
    float fraction;
}zhangsan;

zhangsan.id = 300;

这种方法的缺点就是下次要是再想定义此类型的结构体变量时,还是只能这样写,因为它没有定义一种新的结构体类型名。

第四种:使用关键字typedef为定义的结构体类型名定义一个新的类型名

/* 结构体类型的定义 */
typedef struct Student{
    char name;
    int year;
    int id;
    float fraction;
}student;


/* 结构体变量的定义 */
struct Student zhangsan;  // 方法一
student lisi;  // 方法二

在这种方法中使用关键字typedef使得student(别名)和struct Student(结构体类型名)有同样的功能,简化了后期结构体变量的定义,此时的student可以认为就是一种和int,float等类型名一样的,并且在定义变量时不再需要关键字typedef,目前最常用的就是这种了。

2.3.含函数名的结构体的定义和变量的定义

/* 定义两个子函数 */
void function1(int a, int b)
{
    printf("a+b的值为:%d\r\n",(a+b));
}
	
int function2(int c)
{
	printf("c的值为:%d\r\n",c);
	return c;
}

/* 结构体类型的定义 */
struct Example{
    int a;
    int b;
    void (*function1)(int a, int b);
	int (*function2)(int c);
};

/* 结构体变量的定义 */
struct Example example = {10, 10, function1, function2};  // 指定结构体中各成员的具体意义
example.function1(1, 2);
example.function2(100);

代码运行的结果如下图所示:

这样以来可以看到,结构体中的变量可以执行。这里需要注意几点,一是在定义结构体的时候,函数名要以指针形式存在,结构体中函数的类型要与实际函数的类型对应,不然会报错;二是在使用结构体变量时要先声明各函数所对应的实际函数,然后函数就可以和普通的数据类型用“.”来调用。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值