C语言 | 结构体


文章目录

  • C语言 | 结构体
  • C语言结构体详解:
  • 1.实例(多重嵌套)
  • 1-1.定义
  • 1-2.初始化
  • 2.结构体
  • 2-1、结构体
  • 2-1-1、结构体的类型定义:
  • 2-1-2、结构体变量的定义:
  • 2-1-3、结构体变量的初始化:
  • 2-1-4、使用:
  • 2-1-5、结构体数组:
  • 2-1-6、结构体指针:


C语言结构体详解:

http://c.biancheng.net/c/100/

1.实例(多重嵌套)

1-1.定义

C语言 | 结构体_初始化

#define DEV_SERIAL_NUM_MAX_LEN      (11)
#define PWD_MANAGER_MAX_LEN         (11)
#define PWD_PLAYER_MAX_LEN          (11)

#define DEVICE_ID_STR_MAX_LEN       (12)
#define DEP_NAME_STR_MAX_LEN        (32)
#define DEPT_ID_STR_MAX_LEN         (12)
#define USER_NAME_STR_MAX_LEN       (32)
#define USER_ID_STR_MAX_LEN         (12)

#define CHECK_ERR_TIME_MAX_LEN      (32)

#define CARD_LABEL_NAME_MAX_LEN     (DEVICE_ID_STR_MAX_LEN*2)

#define BLOCK_SPM_MAGIC_HEAD        MAKEFOURCC('S', 'P', 'M', ' ') //(0x53504D20)  // "SPM "
#define BLOCK_SPM_MAGIC_TAIL        MAKEFOURCC('T', 'Q', 'O', ' ') //(0x54514F21)  // "TQO "

#define BLOCK_SERN_MAGIC_HEAD       MAKEFOURCC('S', 'E', 'R', 'N') //(0x5345524E)  // "SERN"
#define BLOCK_SERN_MAGIC_TAIL       MAKEFOURCC('T', 'G', 'S', 'O') //(0x5446534F)  // "TGSO"

#define CHECK_ERR_WHEN_POWER_ON              (0xA100)
#define CHECK_ERR_WHEN_SETTING_BY_TOOLS      (0xA200)

#define DEF_DEVICE_ID               "DEMO"
#define DEF_DEV_CAM_PWR_MANAGER     "000000"

typedef enum _DEVICE_INFO_TYPE_{
    DEVICE_INFO_SERIALNUM = 0,
    DEVICE_INFO_PWRCAMMANAGER,
    DEVICE_INFO_PWRPLAYER,
    DEVICE_INFO_DEVID,
    DEVICE_INFO_DEPTNAME,
    DEVICE_INFO_DEPTID,
    DEVICE_INFO_USERNAME,
    DEVICE_INFO_USERID,
    DEVICE_INFO_CHECKERRTIME,
    DEVICE_INFO_MAGIC,
    DEVICE_INFO_TYPE_IDMAX,
}DEVICE_INFO_TYPE;

typedef struct _DEVICE_INFO_{
    CHAR DeviceSerialNumFlag;
    CHAR DeviceSerialNum[DEV_SERIAL_NUM_MAX_LEN];
    CHAR PWDManagerFlag;
    CHAR PWDManager[PWD_MANAGER_MAX_LEN];           // 执法记录仪管理工具密码
    CHAR PWDPlayerFlag;
    CHAR PWDPlayer[PWD_PLAYER_MAX_LEN];             // 播放器密码
}DEVICE_INFO, *pDEVICE_INFO;

typedef struct _USER_INFO_{
	CHAR DeviceID[DEVICE_ID_STR_MAX_LEN];   // 产品序号
	CHAR DeptName[DEP_NAME_STR_MAX_LEN];    // 使用单位
	CHAR DeptID[DEPT_ID_STR_MAX_LEN];       // 单位编号
	CHAR UserName[USER_NAME_STR_MAX_LEN];   // 用户名称
	CHAR UserID[USER_ID_STR_MAX_LEN];       // 用户名称
}USER_INFO, *pUSER_INFO;

typedef struct _CHECK_INFO_{
    UINT16 CheckErrType;                    // //0xA100: by pc tools  0xA200: by poweron init
    CHAR CheckErrTime[CHECK_ERR_TIME_MAX_LEN];
}CHECK_INFO, *pCHECK_INFO;

typedef struct _synPermissionsManagement_{
    UINT32 magic_head;

	DEVICE_INFO DeviceInformation;
	USER_INFO UserInformation;
    CHECK_INFO CheckInformation;

	UINT32 magic_tail;
}SynPermissionsManagement, *pSynPermissionsManagement;

//========================================================================================
#define  PS_USRINFO_CALI                    "USER"
#define  USRINFOCALI_VERIFICATION           MAKEFOURCC('U','S','E','R') // 0x52455355

typedef struct _USER_INFO_PACKAGE_{
    SynPermissionsManagement Data;
    UINT32 uiVerifyCode;
    UINT32 uiUserInfoSize;
}USER_INFO_PACKAGE,* pUSER_INFO_PACKAGE;

1-2.初始化

static USER_INFO_PACKAGE UserInfoPackage = {
    .Data = {
        .magic_head = BLOCK_SPM_MAGIC_HEAD,

        .DeviceInformation = {
            .DeviceSerialNumFlag = 0,
            .DeviceSerialNum = "DEMO",
            .PWDManagerFlag = 0,
            .PWDManager = "000000",
            .PWDPlayerFlag = 0,
            .PWDPlayer = "000000",
        },

        .UserInformation = {
            .DeviceID = "DEMO",
            .DeptName = "",
            .DeptID = "",
            .UserName = "",
            .UserID = "",
        },

        .CheckInformation = {
            .CheckErrType = 0,
            .CheckErrTime = "",
        },

        .magic_tail = BLOCK_SPM_MAGIC_TAIL,
    },
    .uiVerifyCode = USRINFOCALI_VERIFICATION,
    .uiUserInfoSize = sizeof(USER_INFO_PACKAGE),
};

2.结构体

2-1、结构体

它是一种复合的数据类型,它是由多个不同类型的数据组成的集合,这些不同类型的数据称为该结构体的成员
在C语言中没有给出结构体这种类型具体的形式(名称),但是给出类定义该结构体类型的方法(格式),在使用结构体类型时,必须先定义结构体具体的类型然后用定义好的类型来定义变量进而使用变量
综上,结构体是一种自定义的复合数据类型,在结构体空间中每个成员都有各自的空间

2-1-1、结构体的类型定义:

C语言 | 结构体_c#_02

2-1-2、结构体变量的定义:

C语言 | 结构体_初始化_03

2-1-3、结构体变量的初始化:

1》完全初始化:按定义成员的先后顺序依次给结构体变量中的每一个成员赋值的过程
struct student st = {1001,"刘德华",1.80,99.9}; 2》部分初始化:按定义成员的先后顺序依次给结构体变量中的前若干个成员赋值的过程
struct student st = {1001,"刘德华",1.80}; 3》指定成员初始化:不按成员的定义顺序赋值,而是指定结构体变量中的某一些成员赋值的过程
struct student st3 = {.name="刘德华",1.80,.sno=1001}; //指定成员初始化

2-1-4、使用:

1》不能只能赋值,例如:
struct student st;st = {1001,"刘德华",1.80,99.9}; //错误的 2》相同类型结构体变量之间可以相互赋值,例如:
struct student st1 = {1001,"刘德华",1.80,99.9}; struct student st2;st2 = st1; //正确的 3》结构体中的成员只能单独使用,例如:

C语言 | 结构体_#define_04

2-1-5、结构体数组:

元素为结构体类型的数组称为结构体数组。

C语言 | 结构体_算法_05

2-1-6、结构体指针:

指向结构体变量的指针称为结构体指针。

C语言 | 结构体_c语言_06

结构体变量与结构体指针的关系:

C语言 | 结构体_初始化_07