结构体指针 分为
1:指向结构体变量的指针
2:指向结构体数组的指针
1.1声明结构体 和 函数指针 注意:声明不占用内存 ,定义才占用内存
/*************声明结构体**************/
typedef struct
{
uint8_t u8MsgId; /*定义ID*/
uint8_t u8Data[8]; /* 数组 */
}Msg_t;
/***********声明函数指针*************/
typedef void(*pRxParseFunc)(Msg_t *pumMsg);
typedef void(*pTxPackFunc)(uint8_t *pu8Db);
/************声明结构体*************/
typedef struct
{
uint8_t u8MsgId; /*ID*/
uint8_t u8MsgLen; /*长度*/
pRxParseFunc pRxMsgFunc;/*接收函数*/
pTxPackFunc pTxMsgFunc; /*发送函数*/
}Msg_List_t;
1.2 指向结构体变量的指针->定义结构体并赋初始 和 发送打印函数
static Msg_List_t g_umTxMsg = { 0x33, 8, NULL, SendAA }; //给结构体赋初值
/***** 定义发送函数 *****/
void SendAA(uint8_t *pu8Db)
{
uint8_t data[8] = { 0,1,2,3,4,5,6,7 };
for(int i = 0; i < 8; i++)
{
pu8Db[i] = data[i]; // 将data中赋值给pu8Db
printf(" SendAA =%d\n ", pu8Db[i]);
}
}
1.3 指向结构体变量的指针 --> 发送函数
/***** pumMsg:结构体指针,指向Msg_List_t结构体变量 *******/
void Sch_TxRegister(Msg_List_t *pumMsg, uint8_t u8Num)
{
uint8_t u8len = 8 ;
uint8_t u8sendData;
if (pumMsg->u8MsgId == 0x33) // 若ID = 0X33 执行对应的函数
{
pumMsg->u8MsgLen = u8len;
pumMsg->pTxMsgFunc(u8sendData);//执行SendAA 函数,并把值赋值给u8sendData;
}
}
1.4 指向结构体变量的指针->主函数
void main(void)
{
Sch_TxRegister(&g_umTxMsg, 0); //结构体的地址
system("pause");
}
2.1 指向结构体数组的指针 ->定义结构体数组 和 发送函数
/****定义结构体数组,g_umTxMsgList 是数组,它的成员是结构体*****/
static Msg_List_t g_umTxMsgList[TX_NUM] =
{
{ 0x00, 8, NULL, SendAA},
{ 0x11, 8, NULL, SendBB}
};
void SendAA(uint8_t *pu8Db)
{
uint8_t data[8] = { 0,1,2,3,4,5,6,7 };
for(int i = 0; i < 8; i++)
{
pu8Db[i] = data[i];
printf(" SendAA = %d\n ", pu8Db[i]);
}
}
void SendBB(uint8_t *pu8Db)
{
uint8_t data[8] = { 0,0x11,0x22,0x33,0x44,0x55,0x66,0x77 };
for (int i = 0; i < 8; i++)
{
pu8Db[i] = data[i];
printf(" SendBB = %d\n ", pu8Db[i]);
}
}
2.2 指向结构体数组的指针 -> 定义发送函数
/*******pumMsgList指针 指向的是结构体数组
等价于pumMsgList[],数组作为行参时退化为指针***********/
void Sch_TxListRegister(Msg_List_t *pumMsgList, uint8_t u8Num)
{
Msg_List_t *pumList = NULL; // 定义结构体指针
Msg_t ummsgSend; // 定义变量
pumList = pumMsgList; // 将pumMsgList数组的地址赋值给结构体,数组名就是数组首元素的地址
for (uint8_t u8loop = 0; u8loop < u8Num; u8loop++)
{
if (pumMsgList[u8loop].u8MsgId == 0x11) /*判断ID 是否一致,
pumMsgList[1]结构体名,pumMsgList[1]. u8MsgId == *(pumMsgList+u8loop).u8MsgId*/
{
pumList->pTxMsgFunc(ummsgSend.u8Data); /* 执行SendBB,将数据赋值给ummsgSend.u8Data数组*/
ummsgSend.u8MsgId = pumMsgList[u8loop].u8MsgId;
}
pumList++; // 数组++
}
}
2.2 指向结构体数组的指针 -> 主函数
void main(void)
{
Sch_TxListRegister(g_umTxMsgList, 2); // 数组名就是首元素的地址
system("pause");
}
总结:
- 结构体变量.成员名。
- (*指针变量).成员名。
- 指针变量->成员名。
- 结构体数组也是数组,只是它的成员是结构体
-
数组名 u8MsgId u8MsgLen pRxMsgFunc pTxMsgFunc g_umTxMsgList[0] 0x00 8 NULL SendAA g_umTxMsgList[1] 0x00 8 NULL SendBB