结构体:构造数据类型
概念:由一类具有相同类型或不同的数据类型构成的数据集合
结构体的定义
结构体变量的初始化
结构体变变量的引用
结构体变量指针
结构体变量数组
结构体变量传参
结构体的定义
结构体的定义:
一般格式:
<存储类型> struct 结构体名称
{
数据类型 成员变量1;
数据类型 成员变量2;
数据类型 成员变量3;
…
数据类型 成员变量n;
};
struct stu
{
char name[32];
int id;
char sex;
float score;
};
结构体定义完成之后,意味着会出现一个新的数据类型
struct stu;
这个数据类型和基本的数据类型可以通用;
int a ;
struct stu b;
结构体使用之前必须有类型的定义,在定义变量;
结构体的特殊定义
1、无名结构体(定义结构体时定义变量)
struct
{
int id;
char name[32];
}a; //a是变量,且申请空间
1.1 struct没有结构体名称
1.2 }和;之间必须要有变量的定义,多个变量用,隔开
1.3 其他结构体部分同标准格式结构体定义
2 、嵌套定义
#include <stdio.h>
int main(int argc,const char* argv[])
{
struct
{
int class;
char grade[32];
struct
{
int id;
char name[32];
}stud;
}a,b;
return 0;
}
注意:无名结构体嵌套定义之后一定要跟变量
3、结构体重定义
struct stu
{
char name[32];
int id;
char sex;
float score;
};
struct stu a;
struct stu b;
⇒ 转换
typedef struct stu
{
char name[32];
int id;
char sex;
float score;
}STU; //有typedef的时候,则STU是类型名称
STU a;
STU b;
结构体的初始化
typedef struct stu
{
int id;
char name[32];
float score;
}STU; //有typedef的时候,则STU是类型名称
简单初始化:
STU a = {1,“zhangsan”,99.5};
不初始化
STU b;
部分初始化:
STU c = {100};
STU c = {10,"",8.8};
全部初始化 ==》 简单初始化
默认初始化:
STU d = {0};
嵌套初始化
struct
{
int class;
char grade[32];
struct
{
int id;
char name[32];
}stud;
}a={14,"2017",{1,"zhangsan"}};
结构体的引用:
直接引用:"."
a.id
a.name
a.score
间接引用:"->" //间接应用的左值必须是指针
STU stu = {0};
STU *p = &stu;
p->id;
p->name;
p->score;
结构体的指针和数组
结构体的指针:
1、结构体本身的指针
strcut student stu,*pstu;
int a,*pa;
以上的变量都是随机值,指针是野指针
struct student stu ={0};
struct student *pstu = &stu;
⇒ struct student stu ={0},*pstu = &stu;
在访问成员变量过程中:
pstu->xxx;
pstu->yyy;
2、结构体成员变量是指针
struct person
{
char name[32];
long long id;
} ;
struct student
{
int id;
char *name;
};
3、嵌套结构体指针
typedef strcut student
{
int id;
char *name;
}STU;
typedef struct preson
{
long long id;
STU *p;
STU stu;
}PER;
PER per;
STU std;
per.id = 610121200010102345;
per.p = &std;
4、结构体数组
int a[10];
struct student
{
int id;
char name[32];
} ;
typedef strcut student STU;
STU stu[10]; //结构体数组
STU *pstu = &stu[0]; //结构体指针数组
结构体的应用
结构体的应用
1、结构体传参
int add(int a,char b,int c,int *d);
使用结构体传参:
typedef struct
{
int a;
char b;
int c;
int *d;
}NUM;
int add(NUM n);
2、结构体返回值:
int add(int a ,int b);
char *add(int a,int b);
struct NUM add(inta,int b);
结构体的特点
结构体中有多种数据类型要按4字节对齐
1、字节对齐原则
1.1 结构体或联合体总是以第一个数据成员为其实地址,开始默认4字节对齐
1.2 如果结构体中有大数据类型成员,会按照大类型的数据长度最近进4的整倍数对齐
1.3 结构体成员的大小必须是最大成员的整倍数
2、字节对齐开关
#pragma pack(1) //括号内1为1字节对齐
联合体
联合体(共用体):union
定义格式:
union 联合体名称
{
数据类型 成员变量名1;
数据类型 成员变量名2;
…
数据类型 成员变量名3;
};
共用体的每一个成员公用同一块资源;
共用体/联合体:
1、占用的内存长度为其最长的内存长度。
2、不能对共用体变量进行初始化
3、共用体变量不能作为函数的参数或返回值,但是可以使用指向共用体变量的指针
4、成员的引用与结构一样, . ->
5、共用体变量的实现采用覆盖技术
6、共用体所有成员的地址与共用体变量的地址相同
&m = &m.a = &m.b = &m.c = &m.d
大端存储:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中
小端存储:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中
枚举
枚举 ==》 enum
一般格式:
enum 枚举名
{
枚举值表, //单词
};
eg:enum weekday
{
sun, //0
mon, //1
tue, //2
wed, //3
thu, //4
fir, //5
sat, //6
} ;