结构体三种实例化方法(含成员函数)

结构体成员函数三种实例化方法

结构体成员函数需要定义成指针函数,定义函数,但不在结构体内实现方法, 在外部(需要在函数体内部实现)

结构体指针使用->符号访问

结构体直接实例化使用.符号访问成员

第一种 : 结构体直接实例化

c 复制代码
#include <stdio.h>

// 在此初始化结构体,内部成员函数定义为指针函数
struct stru{
	void (*hello)(char *str, int *a);
};

// 定义一个同型函数,用于方法实现
void hello_u(char *str, int *a){
	printf("func of hello, %s \r\n", str);
	printf("%d \r\n", *a);
}

int main(){
	char str[10] = "hhhhh";
	int num = 10;
	int *pa = &num;
	// 直接对结构体进行初始化, 不使用指针.
	struct stru stru_inst;
	// 结构体成员函数进行初始化
	stru_inst.hello = hello_u;
	// 结构体成员函数调用
	stru_inst.hello(str, pa);
	return 0;
}

在以上实现过程中,对结构体进行定义,成员函数使用函数指针,结构体实例化的方法使用直接例化(未使用指针),对结构体函数进行函数赋值,最终调用.

第二种 : 结构体指针例化

c 复制代码
#include <stdio.h>
#include <stdlib.h>

struct stru{
	void (*hello)(char *str, int *a);
};

void hello_u(char *str, int *a){
	printf("func of hello, %s \r\n", str);
	printf("%d \r\n", *a);
}

int main(){
	char str[10] = "hhhhh";
	int num = 10;
	int *a = &num;
	
    // 使用结构体指针初始化,申请该结构体大小相同内存
	struct stru *stru_inst = (struct stru *)malloc(sizeof(struct stru));
	// 初始化结构体成员函数方法
	stru_inst->hello = hello_u;
	// 结构体成员函数调用
	stru_inst->hello(str, a);
    // 释放内存
	free(stru_inst);
	return 0;
}

上述该方法使用结构体指针来进行结构体初始化,先向内存申请一块结构体大小相同内存来进行初始化,再使用->来进行函数初始化以及调用,最后释放掉内存

第三种 : 使用.member = value进行结构体赋值

C 复制代码
#include <stdio.h>

struct stru{
	int a;
	void (*hello)(char *str, int *a);
};

void hello_u(char *str, int *a){
	printf("func of hello, %s \r\n", str);
	printf("%d \r\n", *a);
}

int main(){
	char str[10] = "hhhhh";
	int b = 10;
	int *pa = &b;
	struct stru stru_u{
		.a = b,
		.hello = hello_u
	};
	printf("stru_u.a is %d\r\n", stru_u.a);
	stru_u.hello(str, pa);
	return 0;
}

此段代码同方法一一样的初始化方法,不同在于使用 .成员 = 赋值 来进行初始化

总结

对于struct stru stru_u初始化方法, 直接进行实例化,使用范围比较局限

对于struct stru *stru_u 初始化方法, 使用范围较广, 因为本质是一个指针,可以一直传递处理

上面主要讲述了三种结构体初始化方法, 主要针对于成员函数进行展开,一般常用数据类型对于各位不在话下, 文中有部分概念使用有误,相信大家明白意思就行.