結構體三種例項化方法(含成員函式)

天若手提滑铲發表於2024-03-16

結構體成員函式三種例項化方法

結構體成員函式需要定義成指標函式,定義函式,但不在結構體內實現方法, 在外部(需要在函式體內部實現)

結構體指標使用->符號訪問

結構體直接例項化使用.符號訪問成員

第一種 : 結構體直接例項化

#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 初始化方法, 使用範圍較廣, 因為本質是一個指標,可以一直傳遞處理

上面主要講述了三種結構體初始化方法, 主要針對於成員函式進行展開,一般常用資料型別對於各位不在話下, 文中有部分概念使用有誤,相信大家明白意思就行.

相關文章