结构体定义
由若干不同数据类型组成的新的复合数据类型.(自定义类型).封装.
格式: struct 结构体名{结构体成员部分};
定义结构体变量:
struct 结构体名 变量名;
struct 结构体名{结构体区域}变量名;
初始化方式
第一种:struct Man danny = {666,1};
第二种:struct Man{
int id;
int sex;
}xiaqi = {999,0};
第三种: 赋值方式 直接通过点去访问结构体中的成员变量.
xiaqi.id = 999;
xiaqi.sex = 1;
结构体重命名:
typedef struct woman{
char name;
int id;
}xxx;
结构体指针
一个指针指向于结构体,定义如下
struct woman* pXiaqi = (struct woman*)malloc(sizeof(Wm));
使用: 用指针通过->的方式访问成员变量,例如:
pXiaqi->id = 123;
结构体嵌套:
- 在结构体中定义结构体例如;
struct wo{
int id;
char name;
int sex;
struct baby
{
int id;
char name;
}zichen;
}
- 在结构体中使用结构体变量
struct WM
{
int id;
char name;
}TF_wm;
struct wo
{
int x;
TF_wm guangguang; //TF_wm就是结构体WM的别名,guangguang是名字
};
代码示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct woman //结构体woman,前面加一个typedef 就是要去别名。后面的Wm就是别名
char name[20];
int id;
}Wm,*Pwm; //结构体woman的别名
typedef struct wo
{
int id;
char name;
int sex;
struct baby
{
int id;
char name;
}zichen;
Wm guanguang;
}wo;
//typedef struct woman* Pwm;
int main()
{
//动态分配一个结构体内存空间大小 pxiaqi指向这块内存.
struct woman* pXiaqi = (struct woman*)malloc(sizeof(Wm));
printf("pxiaqi = %d\n", sizeof(pXiaqi));
pXiaqi->id = 123;
strcpy(pXiaqi->name ,"xiaqi");
printf("名字%s,id = %d\n", pXiaqi->name, pXiaqi->id);
Pwm pxq;
wo tutu;
tutu.id = 233; //结构体的元素赋值
tutu.zichen.id = 333;
tutu.sex = 1;
tutu.zichen.name = 'z';
tutu.guanguang.id = 123; //结构体的元素赋值
strcpy(tutu.guanguang.name , "gg");
return 0;
}
结构体数组
数组中元素时结构体.每个元素都是结构体组成.
访问结构体: 每个元素都是结构体,把每个元素当做结构体变量使用
arr[0].id = 123;
位段:按照位的方式存储结构体中某一个成员变量的某几位
格式: struct 结构体名{类型 变量名:长度};
案例:
typedef struct person
{
unsigned char sex:1; // sex = 3; 位段
char name;
int id;
}per,*Pper;
对齐和补齐:
1. 小的数据类型放最前面,按照从小到大定义变量
2. 相同数据类型放一起.
大端和小端:
小端:数值的高位字节放在内存的高地址上
代码示例
#include <stdio.h>
//位段
typedef struct person
{
unsigned char sex:1; // sex = 3;
char name;
int id;
}per,*Pper;
struct test
{
char x;
int y;
char z;
};
int main()
{
per danny;
per arr[10] = { { 1, '1', 1 }, { 0, 'a', 2 }, {0,'v',3} };
arr[0].id = 123;
arr[0].name = '1';
arr[0].sex = 1;
printf("arr[0].id = %d ,arrr[0].name = %c\n", arr[0].id, arr[0].name);
printf("sizeof(arr) = %d\n", sizeof(arr));
//第二个知识点
per xq; //由于结构体per 中 sex使用了位段的形式unsigned char sex:1;,所以sex的值只能为0或者1
xq.sex = 1;
printf("xq.sex = %d\n", xq.sex);//sex的值为1的时候++,结果又会变成0
xq.sex++;
printf("xq.sex = %d\n", xq.sex);
xq.sex++;
printf("xq.sex = %d\n", xq.sex);
struct test t;
printf("sizeof(t) = %d", sizeof(t));
int x = 0x12345678;
return 0;
}