结构体指针

结构体指针 分为 

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");

}

总结:

  • 结构体变量.成员名。
  • (*指针变量).成员名。
  • 指针变量->成员名。
  • 结构体数组也是数组,只是它的成员是结构体
  •  
    数组名 u8MsgIdu8MsgLenpRxMsgFuncpTxMsgFunc
    g_umTxMsgList[0]  0x008NULLSendAA
    g_umTxMsgList[1] 0x008NULLSendBB

     

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值