梓益C语言学习笔记之结构体——共用体-枚举
有人说,我们需要将不同类型的数据组合成一个整体,于是,就有了结构体
一、结构体的概念:
一种或多种基本类型或构造类型的数据的集合。
二、定义方法:
先定义结构体类型,再去定义结构体变量
结构,结构体类型名{
成员列表
};
如:
struct stu {
int num;
char[20]名称;
字符性;
};
struct斯图,露西,鲍勃,李雷;//定义了三个结构体stu类型的变量
每个变量都有三个成员,分别是num的名字,性
通常咱们将一个结构体类型重新起个类型名,用新的类型名替代原先的类型
* *最常用的定义结构体的方法是:
typedef struct stu {
int num;
char[20]名称;
字符性;
} stu;
stu露西。
三,初始化及使用:
typedef struct stu {
int num;
char[20]名称;
字符性;
} stu;
stu露西={101年“lucy", & # 39; f # 39;};
stu鲍勃;
bob.num=101;//鲍勃是个结构体变量,但是鲍勃。num是个int类型的变量
bob.name是个字符数组,是个字符数组的名字,代表字符数组的地址,是个常量
bob.name=癰ob";//是不可行,是个常量
拷贝字符串(bob.name,“bob");
四、结构体数组
结构体数组是个数组,由若干个相同类型的结构体变量构成的集合
1,结构体数组的定义方法:
struct stu {
int num;
char[20]名称;
字符性;
};
struct stu edu[3];//定义了一个struct stu类型的结构体数组edu,
这个数组有3个元素分别是edu [0], edu [1], edu [2]
,,,,可以这样赋值:斯图edu [3]={
{101年“Lucy" 78},
{102年“Bob", 59.5},
{103年“Tom" 85}
};
2,数组元素的使用
edu [0]。num=101;//用101给edu数组的第0个结构体变量的num赋值
strcpy(edu[1].name,"lucy");
五、结构体指针
即结构体的地址,结构体变量存放内存中,也有起始地址
定义一个变量来存放这个地址,那这个变量就是结构体指针变量。
1、结构体指针变量的定义方法:
struct stu{
int num;
char name[20];
};
struct stu * p;//定义了一个struct stu *类型的指针变量,变量名是p,p占4个字节,用来保存结构体变量的地址编号
使用:struct stu boy;
p=&boy;
访问结构体变量的成员方法:
boy.num=101;//可以,通过结构体变量名.成员名
(*p).num=101;//可以,*p相当于p指向的变量boy
p->num=101;//可以,指针->成员名
通过结构体指针来引用指针指向的结构体的成员,前提是指针必须先指向一个结构体变量。
六、结构体内存分配
为什么要有字节对齐?
用空间来换时间,提高cpu读取数据的效率
结构体变量大小是所有成员之和
规则1:结构体分配内存时哪个基本类型的成员占字节数多,就以它的大小为单位开辟内存,
在gcc中出现了double类型的,例外
1:成员中只有char型数据 ,以1字节为单位开辟内存。
2:成员中出现了short int 没有更大字节数的基本类型数据以2字节为单位开辟内存
3、出现了int float 没有更大字节的基本类型数据的时候以4字节为单位开辟内存。
4、出现了double类型的数据
情况1:
在vc里,以8字节为单位开辟内存。
情况2:
在gcc里,以4字节为单位开辟内存。
无论是那种环境,double型变量,占8字节。
注意:
如果在结构体中出现了数组,数组可以看成多个变量的集合。
如果出现指针的话,没有占字节数更大的类型的,以4字节为单位开辟内存。
在内存中存储结构体成员的时候,按定义的结构体成员的顺序存储。
例1:struct stu{
char sex;
int age;
}lucy;
lucy的大小是4的倍数。
规则2:字节对齐
1:char 1字节对齐 ,即存放char型的变量,内存单元的编号是1的倍数即可。
2:short int 2字节对齐 ,即存放short int 型的变量,起始内存单元的编号是2的倍数即可。
3:int 4字节对齐 ,即存放int 型的变量,起始内存单元的编号是4的倍数即可
4:long int 在32位平台下,4字节对齐 ,即存放long int 型的变量,起始内存单元的编号是4的倍数即可
5:float 4字节对齐 ,即存放float 型的变量,起始内存单元的编号是4的倍数即可