示例代碼:
#include"stdio.h"
#include"stdint.h"
typedef void (*hanshuzhizhen) (void);
struct jiegouti//這是個結構體
{
int8_t paraone;//第一個參數
uint8_t paratwo;//第二個參數
uint16_t parathree;//第三個參數
hanshuzhizhen func;//函數指針、結構體內部函數
};
void jiegoutineibuhanshu(void)
{
printf("結構體內部函數被調用了/n");
}
const struct jiegouti jiegoutishuzu[2]=//這個就是結構體數組,最多裏面兩個結構體
{
[1] ={
1,
2,
3,
(hanshuzhizhen)jiegoutineibuhanshu
},
};
int main()
{
uint8_t paraone;
uint16_t paratwo;
paraone = jiegoutishuzu[1].paraone;
paratwo = jiegoutishuzu[1].paratwo;
printf("paraone = %d\n,paratwo = %d\n",paraone,paratwo);
jiegoutishuzu[1].func();
}
1.結構體數組聲明_結構體數組內部出現方括號是什麼:
這裏的結構體叫做jiegouti,裏面含3個元素,paraone,paratwo,parathree,結構體數組就是一個數組,每一個數組元素都是一個結構體,每一個數組元素裏面都有三個結構體元素,我們這裏的結構體數組叫jiegoutishuzu,裏面有2個結構體,分別是jiegoutishuzu[0]、jiegoutishuzu[1],我們初始化jiegoutishuzu[1]的結構體元素是1 2 3 。
這裏的[1]就是說jiegoutishuzu[1]賦值,如果沒有這個[1]那就是按照[0],[1]的順序初始化賦值。
struct jiegouti//這是個結構體
{
int8_t paraone;//第一個參數
uint8_t paratwo;//第二個參數
uint16_t parathree;//第三個參數
};
const struct jiegouti jiegoutishuzu[2]=//這個就是結構體數組,最多裏面兩個結構體
{
[1] ={
1,
2,
3,
},
};
2.函數指針聲明
函數指針就是指向函數的指針,函數名就是函數指針,聲明一個函數指針之後,就可以讓他指向一些同類函數:
這裏的jiegouti裏面增加了一個類型是hanshuzhizhen類型的函數指針,這類函數指針,專門指向輸入輸出都是void的函數,這裏指向的函數名叫func:
typedef void (*hanshuzhizhen) (void);
hanshuzhizhen func;
這種聲明就相當於 void func(void):
在實例化結構體的時候,或者說給結構體數組元素結構體賦初值的時候,就需要在相應位置放一個輸入輸出都是void的函數:
(hanshuzhizhen)jiegoutineibuhanshu
這個函數就是結構體內部數組——jiegoutineibushuzu,功能就是輸出一個調用成功聲明。
typedef void (*hanshuzhizhen) (void);
struct jiegouti//這是個結構體
{
int8_t paraone;//第一個參數
uint8_t paratwo;//第二個參數
uint16_t parathree;//第三個參數
hanshuzhizhen func;//函數指針、結構體內部函數
};
void jiegoutineibuhanshu(void)
{
printf("結構體內部函數被調用了/n");
}
const struct jiegouti jiegoutishuzu[2]=//這個就是結構體數組,最多裏面兩個結構體
{
[1] ={
1,
2,
3,
(hanshuzhizhen)jiegoutineibuhanshu
},
};
3.示例代碼顯示結果
如果在結構體數組實例化中去掉[1],main中調用就會溢出(僅對於函數),因爲實例化的相當於[0],1那部分內存沒初始化(所以值是0):