随笔 - 22,  文章 - 0,  评论 - 2,  阅读 - 3287

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

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

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

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

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

#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;
}

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

第二种 : 结构体指针例化

#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进行结构体赋值

#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 初始化方法, 使用范围较广, 因为本质是一个指针,可以一直传递处理

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

posted on   天若手提滑铲  阅读(381)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示