2024年6月2日发(作者:)

为结构体中函数指针赋值的两种方法

在C语言中,结构体是一种用于聚合多个数据类型的数据结构。结构

体中可以包含不同类型的数据成员,包括基本数据类型、数组、指针等。

在结构体中定义函数指针是一种非常有用的技巧,可以使得结构体实例拥

有特定的行为,实现面向对象的编程思想。本文将介绍两种给结构体中函

数指针赋值的方法。

方法一:直接赋值

以一个简单的例子来说明。假设有一个结构体`Person`,包含姓名和

打招呼的函数指针。定义如下:

```c

typedef struct

char *name;

void (*greeting)(void);

} Person;

```

在这个例子中,`greeting`是一个指向无返回值、无参数的函数指针。

下面我们定义两个函数,分别为英文方式和中文方式打招呼:

```c

void sayHelloInEnglish(void)

printf("Hello!n");

void sayHelloInChinese(void)

printf("你好!n");

```

接下来,我们创建两个`Person`结构体实例,并分别赋值不同的函数

指针:

```c

int mai

Person person1, person2;

= "Alice";

= "张三";

ng = sayHelloInEnglish;

ng = sayHelloInChinese;

ng(; // Hello!

ng(; // 你好!

return 0;

```

在上面的代码中,我们通过直接赋值的方式将函数指针赋值给了结构

体的成员变量。通过调用结构体实例的函数指针成员,可以执行相应的函

数。

方法二:使用函数指针变量间接赋值

除了直接赋值,我们还可以使用函数指针变量来间接赋值。在这种方

式下,先定义一个函数指针类型,并声明一个函数指针变量。然后将函数

指针变量赋值给结构体的成员变量。下面是相应的示例代码:

```c

typedef void (*GreetingFunc)(void); // 定义函数指针类型

void sayHelloInEnglish(void)

printf("Hello!n");

void sayHelloInChinese(void)

printf("你好!n");

int mai

Person person1, person2;

= "Alice";

= "张三";

GreetingFunc greetingFunc1 = sayHelloInEnglish; // 声明函数

指针变量

GreetingFunc greetingFunc2 = sayHelloInChinese;

ng = greetingFunc1; // 间接赋值

ng = greetingFunc2;

ng(; // Hello!

ng(; // 你好!

return 0;

```

在上述代码中,我们首先用`typedef`定义了一个类型名

`GreetingFunc`,它表示一个函数指针类型。然后,在`main`函数中,声

明了两个函数指针变量`greetingFunc1`和`greetingFunc2`,分别赋值为

`sayHelloInEnglish`和`sayHelloInChinese`。最后,通过间接赋值的方

式将函数指针变量赋值给了结构体中的成员变量。

总结:

本文介绍了两种给结构体中函数指针赋值的方法,分别是直接赋值和

间接赋值。直接赋值是通过直接将函数指针赋值给结构体的成员变量来完

成的,而间接赋值则是先定义一个函数指针变量,然后将函数指针变量赋

值给结构体的成员变量。无论使用哪种方式,都可以实现结构体实例具备

特定行为的目的。这种技巧在编写回调函数、实现面向对象等场景下非常

有用。