发布网友 发布时间:2022-04-25 15:13
共1个回答
热心网友 时间:2023-10-11 14:41
前面只是指定了一种结构体类型,它相当于一个模型,但其中并无具体数据,系统也不为之分配实际的内存单元为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。 (1) 先声明结构体类型再定义变量名如上面已定义了一个结构体类型Student,可以用它来定义结构体变量。如
struct Student student1, student2;
以上定义了student1和student2为结构体类型struct Student的变量,即它们具有struct Student类型的结构。在定义了结构体变量后,系统会为之分配内存单元。例如student1和student2在内存中各占63个字节
(4+20+1+4+4+30=63)。
但是这里需要注意:名义上计算大小为63,根据不同编译器,内存存储会有所不同,在存储该结构体时会按照内存对齐进行相关处理,系统默认对齐系数为4(即按int类型对齐,粗略认识可以认为每相邻两个数据成员存储是大小是4的整数倍,请参考下面对比结构体),详情请参考内存对齐,因此该结构体实际大小为:68,具体计算如下:
{
int num;//整型,4个字节
char name[20];//字符数组20个字节,4的整数倍,取20字节
char sex;//字符类型,一个字节,往下不能凑齐4个字节,因此取4个字节
int age;//以下同理 4个字节
float score;//4个字节
char addr[30];//字符数组30个字节,取4整数倍,因此为32
}
故实际大小为:4+20+4+4+4+32=68
对比结构体:1
{
int num;//整型,4个字节
char name[19];//字符数组19个字节,往下能取4的整数倍,取20字节
char sex;//存放在上面字符数组char name[19]后面,凑成20字节,为了表示存在这个数据,在这里给个0
int age;//以下同理 4个字节
float score;//4个字节
char addr[30];//字符数组30个字节,取4整数倍,因此为32
}
故实际大小为:4+20+0+4+4+32=
对比结构体:2{
int num;//整型,4个字节
char name[20];//字符数组19个字节,往下能取4的整数倍,取20字节
char sex;//字符类型,一个字节,往下能凑上一个字符数据字节,单任不能凑齐4个字节,因此取4个字节
char test;//新增加的数据类型,已往上存放,为了表示存在这个数据,这里给个0
int age;//以下同理 4个字节
float score;//4个字节
char addr[30];//字符数组30个字节,取4整数倍,因此为32
}
故实际大小为:4+20+4+0+4+4+32=68
(2) 在声明类型的同时定义变量
例如:
struct Student//声明结构体类型Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}student1,student2;//定义两个结构体类型Student的变量student1,student2
这种形式的定义的一般形式为
struct 结构体名
{
成员表列
}变量名表列;
(3) 直接定义结构体类型变量
其一般形式为
struct//注意没有结构体类型名
{
成员表列
} 变量名表列;
这种方法虽然合法,但很少使用。提倡先定义类型后定义变量的第(1)种方法。
在程序比较简单,结构体类型只在本文件中使用的情况下,也可以用第(2)种方法。
关于结构体类型,有几点要说明:
(1) 不要误认为凡是结构体类型都有相同的结构。实际上,每一种结构体类型都有自己的结构,可以定义出许多种具体的结构体类型。
(2) 类型与变量是不同的概念,不要混淆。只能对结构体变量中的成员赋值,而不能对结构体类型赋值。在编译时,是不会为类型分配空间的,只为变量分配空间。
(3) 对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。
(4) 成员也可以是一个结构体变量。
如
struct Date //声明一个结构体类型Date
{
int month;
int day;
int year;
};
struct Student
//声明一个结构体类型Student
{
int num;
char name[20];
char sex;
int age;
Date birthday;
char addr[30];
}student1,student2;
//定义student1和student2为结构体类型Student的变量Student的结构。
(5) 结构体中的成员名可以与程序中的变量名相同,但二者没有关系。
例如,程序中可以另定义一个整型变量num,它与student中的num是两回事,互不影响。 和其他类型变量一样,对结构体变量可以在定义时指定初始值。如
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}student1={10001,Zhang Xin,'M',19,90.5,Shanghai};
这样,变量student1中的数据如图7.2中所示。也可以采取声明类型与定义变量分开的形式,在定义变量时进行初始化:
student2= student1;