結構體成員函式三種例項化方法
結構體成員函式需要定義成指標函式,定義函式,但不在結構體內實現方法, 在外部(需要在函式體內部實現)
結構體指標使用->符號訪問
結構體直接例項化使用.符號訪問成員
第一種 : 結構體直接例項化
#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 = #
// 直接對結構體進行初始化, 不使用指標.
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 = #
// 使用結構體指標初始化,申請該結構體大小相同記憶體
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
初始化方法, 使用範圍較廣, 因為本質是一個指標,可以一直傳遞處理
上面主要講述了三種結構體初始化方法, 主要針對於成員函式進行展開,一般常用資料型別對於各位不在話下, 文中有部分概念使用有誤,相信大家明白意思就行.