C语言学习难点突破专题(一)——结构体(2)

本文介绍了结构体在C语言中的三种定义方式,并通过typedef创建别名简化定义。文章以stFanKey和stKey为例,展示了如何定义包含函数指针的结构体以及如何通过结构体别名进行初始化和成员访问。stFanKey的成员如PowerOnKey等是stKey类型的结构体变量,通过.FanKey.PowerOffKey.iplay_befor_normal可访问深层成员。
摘要由CSDN通过智能技术生成

在结构体(1)的文章里面,已经介绍了关于结构体定义和使用的基本知识,这一篇内容,直接上干货,将在工作中遇到的结构体的经典案例分享给读文章的各位,同时针对案例讲解结构体的相关知识。

我们知道要定义一个结构体的时候需要使用struct关键字,定义结构体共有三种方式:

//第一种方式
struct Stu{
...
};
Stu stu1,stu2;
//第二种方式
struct Stu{
...
}stu3,stu4;
//第三种方式
struct{
...
}stu5,stu6;

上面三种方式各有不同,但是在实际的运用中,结构体的定义往往少不了typedef的身影,typedef是类型定义的意思,它的是作用是给其他的数据类型声明一个别名,那么上面的结构体定义可以换成以下写法:

/*
 *  定义了一个结构体Stu,结构体Stu的别名为stu1,stu2,
 *  使用结构体的别名,定义了两个新的结构体变量,stu2,stu4
*/
typedef struct Stu{
...
}stu1,stu2;
stu1 stu3;
stu2 stu4;

接下来直接上干货

typedef struct
{
    stKey PowerOnKey;
    stKey PowerOffKey;
    stKey ShakKey;
    stKey StopShakKey;
    stKey SpeedUpKey;
    stKey SpeedDownKey;
    stKey TimeKey;
}stFanKey;

typedef struct _stKey_S
{
    uint32_t iplay_befor_normal;//学习前的播报,正常播报
    uint32_t iplay_get_irdata;//学习成功获取IR播报

    unsigned char Nec[4];

    /*当前模式 学键模式/正常模式*/
    E_KeyMode keymode;
    unsigned short key_id; //红外码ID  ir_data_t.key_id 暂时不用, 从 0xb0000000 - 0xb0010000

    /*按键相关数据*/
    //ir_data_t *key_data;

    /*按键相关接口*/
    int (*initKey)(struct _stKey_S* pKey); //初始化IR按键
    int (*storeIR)(struct _stKey_S* pKey, ir_data_t* pIr_Key);//存储IR按键
    int (*deleteIR)(struct _stKey_S* pKey);//存储IR按键
    int (*sendIR)(struct _stKey_S* pKey);//发送IR按键
    E_StoreFlag (*checkIRLearn)(struct _stKey_S* pKey);//判断是否学习

    int (*playVoice)(struct _stKey_S* pKey, int iplay_id);//播报方法某一个ID

}stKey;

static stFanKey FanKey =
{
    .PowerOnKey  = {FAN_VOICE_POWER_ON, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
    .PowerOffKey = {FAN_VOICE_POWER_OFF, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
    .ShakKey     = {FAN_VOICE_SHAK, MAIN_VOICE_BEEP,     .Nec = {0x00, 0x00, 0x00, 0x00},},
    .StopShakKey = {FAN_VOICE_STOP_SHAK, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
    .SpeedUpKey    = {FAN_VOICE_SPEED_UP, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
    .SpeedDownKey    = {FAN_VOICE_SPEED_DOWN, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
    .TimeKey     = {FAN_VOICE_TIME, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
};

可以看到上面三段程序就将结构体运用得十分经典,我们从结构体stFanKey入手慢慢解析。

首先stFanKey是一个结构体别名,但是这个结构体在定义的时候没有自己的结构体名,所以stFanKey就是该结构体的结构体名;

接下来看stFanKey结构体的成员,都是通过stKey声明的结构体变量,现在我们将目光转移到stKey上,这也是一个结构体别名,是_stKey_S的别名,_stKey_S这个结构体成员就比较复杂,有普通变量,有数组,还有函数指针(函数指针的定义方式:需要指向函数的函数类型+(* 函数指针名)+(函数的的参数类型,这里的函数指针存在的意义是为了方便直接调用函数。)

比如我现在用stKey声明了一个结构体变量stKey Tempkey;

我需要调用stKey里面的storeIR函数,则只需要Tempkey.storeIR(参数)即可。

再来看FanKey,FanKey是stFanKey类型的结构体变量,当需要访问FanKey的成员的时候通过:

FanKey.PowerOffKey

因为FanKey的成员也是结构体变量,所以可以通过:

FanKey.PowerOffKey.iplay_befor_normal

访问stKey的成员iplay_befor_normal。

而在定义FanKey的时候,这里直接对里面的成员进行整体赋值,其中的.PowerOffKey就是FanKey.PowerOffKey,其中的.NEC就是FanKey.PowerOffKey.NEC

这样赋值清晰明了,且代码简洁,如果每个成员单独赋值,代码段就长得离谱了。

文章就到此结束了,如果有新的比较经典的运用,我会保持更新,看了的码友记得点赞!

保持学习的态度,吾任重而道远!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值