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语言结构体详解:
1.实例(多重嵌套)
1-1.定义
#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、结构体的类型定义:
2-1-2、结构体变量的定义:
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》结构体中的成员只能单独使用,例如:
2-1-5、结构体数组:
元素为结构体类型的数组称为结构体数组。
2-1-6、结构体指针:
指向结构体变量的指针称为结构体指针。
结构体变量与结构体指针的关系: