1)构造类型及结构体
a、c语言构造类型
构造数据类型:构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。
在c语言中,构造类型有以下几种:
数组类型
结构体类型
共用体(联合)类型
b、什么是结构体?
在实际问题中,一组数据往往具有不同的数据类型。为了解决不同数据类型的存储问题,C语言中给出了另一种构造数据类型----“结构”或叫“结构体”。
“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员都可以是一个基本数据类型或者又是构造类型。
结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造他。如同在说明和调用函数之前要先定义函数一样。
c、为什么要有结构类型?
结构体可以把功能相同的数据组织起来,存在一起,用的时候方便,而且在调用函数的时候,若传递参数较多,传一个结构体相对而言简单一些,很多系统自带的函数必须用结构体。
2)定义结构体的方法
a、定义结构体的方法
定义结构体的一般形式为:
struct 结构名{
成员列表
};
例如:定义一个学生的结构体
struct student{
int num;
char name[20];
char sex;
float score;
}
成员列表由若干个成员组成,每个成员都是该结构的一个组成部分,对每个成员也必须做类型说明。其形式为:
3)结构体变量及定义方法
a、结构体变量定义有三种方法
①先定义结构体,然后在定义结构体变量
例如:
struct Student{
int num;
char name[10];
char sex;
float score;
}
注意:
a)结构体定义完成以后,计算机并不会给结构体分配内存空间
b)会在定义结构体变量后分配存储空间。
结构体变量定义格式:
struct 结构体名 结构体变量名;
例如:struct Student sut1;//表示定义一个Student类型结构体变量
struct Student stu2,stu3,stu4;//定义多个结构体变量。
②定义结构体的同时定义结构体变量
格式:
struct 结构体名{
}结构体变量1,结构体变量2,结构体变量3...;
例如:
struct Student{
int num;
char name[10];
char sex;
float score;
}stu5,stu6,stu7;//也是用Student结构体定义了三个结构体变量
③使用匿名结构体来定义结构体变量
格式:
struct {
}结构体变量1,结构体变量2,结构体变量3...;
例如:
struct{
char *color;
int speed;
}car1,car2,car3;
4)结构体变量中成员的访问方法
a、结构变量中成员的访问方法
在程序中,使用结构体变量时,往往不把它作为一个整体来使用。
一般形式:
表示结构变量名.成员名
如:boy.name;
如果成员本身又是一个结构体则必须逐级找到最低级的成员才能使用。
例如:boy1.birthday.month
即:第一个人出生的月份成员可以再程序中单独使用,与普通变量完全相同。
代码示例:
struct Car{
char *pp;
int lunzi;
int speed;
};//定义一个Car类型的结构体
struct Car car1;//用结构体类型定义结构体变量
car1.pp;//获取品牌
car1.lunzi;//获取轮子
car1.speed;//获取速度
5)结构体变量的初始化
a、先定义结构体变量,然后再初始化
struct stu{
int num;
char name[20];
char sex;
float score;
};
struct stu boy1,boy2;
stu1.num=123;
strcpy(stu1.name,"zhangsan");
stu1.sex='男';
stu1.score=88.8f;
b、定义的同时初始化
struct stu boy3={124,"李四",'男',90.5f};
c、定义结构体的同时,还可以指定元素初始化
struct stu boy5={.name="angelaBaby"};
6)结构体变量存储原理
a、结构体存储原理
结构体占用的内存空间是每个成员占用的字节数之和(考虑对齐问题);
b、结构体数据成员对齐的意义
简化处理器与内存之间传输系统的设计
提升读取数据的速度。
c、结构体对齐的含义
结构体总长度
结构体内各数据成员的内存对齐,即该数据成员相对结构体的起始位置。
7)结构体变量占用存储空间大小
a、结构体大小的计算方法和步骤
①将结构体内所有数据成员的长度值相加,记为sum_a;
②将各数据成员为了内存对齐,按各自对齐规模数而填充的字节数累加到和sum_a上,记为sum_b。对齐模数是#pragma pack指定的数值以及该数据成员自身长度中数值较小者。该数据相对起始位置应该是对其模式的整数倍。
③将和sum_b向结构规模数对齐,该模数是#pargma pac指定的数值和结构体内部最大的基本数据类型成员长度中数值较小者。结构体的长度应该是该模数的整数倍。
所谓”对齐在N上“指定是”存放起始地址%N=0“
8)结构体作用域
a、作用域概述
结构体类型定义在函数内部的作用域与局部变量的作用域是相同的
函数外部定义的结构体类型类似于全局变量
全局作用域:从定义的哪一行开始知道本文件结束为止
b、作用域分类
结构体根据作用域可以分为全局结构体、局部结构体
|
|