结构(struct)
注意:命名开头大写!
什么是结构:
一种程序员自己设计的数据类型,由若干个不同的数据类型组成,可用于描述一个事物的各项数据
设计结构
struct 结构名
{
类型1 成员名1:n; // 可以用n指定成员使用的字节数
类型2 成员名2;
类型3 成员名4;
...
};
定义结构变量
struct 结构名 结构变量名
注意:struct关键字不能省略
访问成员
结构变量名.成员名
用字符串strcpy进行赋值
打印: str[ ] -> strcpy -> %s ; str -> = ’ ’ -> %c
初始化
结构变量与普通变量一样,默认值是不确定的
1、 struct 结构名 结构变量名 = {"张三",'m',"销售"}
注意:要按照成员的顺序初始化,顺序不可变,若少初始化了,则后面的默认为0
2、 初始化指定的成员
struct 结构名 结构变量名 = {.成员名 = 'f',...}
eg. = {.post = "秘书",.name = "张三"}
注:可不按顺序,{}中没初始化的成员(sex)及和数组一样默认为0
typedef
类型重定义,可以给已有的数据类型重定义一个简短的名字
struct 结构名是一种类型,typedef可以把他们两个重定义成一个单词的数据类型
注意:struct可以定义匿名结构,但要立即定义结构变量,或使用typedef对匿名结构重定义,但不建议
eg. typedef struct Student Student
或 typedef struct Student
{
...
}Student;
相当于将struct Student取名为Student,和#define相似
注意:typedef与#define只是相似,本质不同,#define仅仅是内容替换,而typedef是重定义一个类型,比如:
typedef int* intp; -> 能将p1,p2都定义成int*
#define intp int* -> 只有p1是指针,p2不是
intp p1,p1;
在堆内存中存储结构变量
结构体占内存较多/字节数比较大,因此不适合存储在栈内存中,一般存放在堆内存中
在堆内存中分配一块内存,大小为结构体大小的字节数,然后用结构指针指向它
struct Student* stup = malloc(sizeof(struct Student));
使用结构指针访问成员名:
1、结构指针->成员名
eg. p->name, &p->sex
2、(*结构指针).成员名
eg. (*p).name
注意:’ . '的运算级别比*高,所以要加( )
计算结构的字节数
1、结构成员的顺序会影响结构的字节数,因此设计结构体时,选择合适的成员顺序可以尽可能的节约内存
2、结构的每个成员都有自己的存储空间,因此结构的字节数是所有成员的字节数总和还要多
3、结构类型为了能够快速地访问成员,会对成员的存储位置进行对齐和补齐
对齐:
(假定每个结构都是从零地址开始)每个成员存储的内存编号必须是它本身字节数的整数倍,如果不是整数倍则使用后面的内存(结构的成员之间可能会有一些空隙)(33’)
补齐:
结构体的字节数必须是它最大成员的整数倍,如果不是则填充一些空字节
注意:在Linux系统下,计算补齐和对齐时,超出4的按4计算,Windows下正常计算