目录
一.前言
前几天在看一个代码的时候,发现在结构体成员中出现了函数名,半天没有看懂,感觉有一点奇怪,后来查了一点资料,这里记录一下。
二.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);
代码运行的结果如下图所示:
这样以来可以看到,结构体中的变量可以执行。这里需要注意几点,一是在定义结构体的时候,函数名要以指针形式存在,结构体中函数的类型要与实际函数的类型对应,不然会报错;二是在使用结构体变量时要先声明各函数所对应的实际函数,然后函数就可以和普通的数据类型用“.”来调用。