结构类型
1.定义
- 结构是逻辑上相互联系的一组分量的集合
- 结构中的分量可以是不同类型的数据,称为结构的成员
- 在使用结构之前,首先根据具体问题,利用已有的数据类型对结构的组成进行描述,成为结构的定义
2.一般形式:
struct
结构类型名
{
成员列表;
};
举个例子:
struct student//struct student为结构类型名,student为标签
{
int num;
char name[20];
char sex;
struct date1 age;//age为date1结构
char addr[30];//花括号中间的为成员
};//分号表示结束
struct date1
{
int year;
int month;
int day;
};
结构变量
1.定义
- 在定义结构类型之后,表示声明了一种新的数据类型,并没有内存空间的分配。
- 必须用结构类型定义相应的变量才能使用
方法一:先声明结构类型再定义变量
struct
结构类型名
{
成员表列;
};
struct 结构类型名 变量名表列;
方法二:在声明结构类型的同时定义变量
struct
结构类型名
{
成员表列;
}变量名表列;
方法三:省去结构标签直接定义变量
struct
{
成员表列;
}变量名表列;
可用符号常量代表一个结构类型名
例子:
#define STUDENT struct student
STUDENT
{
int num;
char name[20];
char sex;
int age;
char addr[30];
};
/*此时,可直接用STUDENT定义变量,如:
STUDENT s1,s2;
不必再写
struct student s1,s2;*/
可用typedef定义一个新的数据类型名
typedef struct student STUDENT;
//或
typedef struct student
{
int num;
char name[20];
char sex;
int age;
char addr[30];
}STUDENT;
//此时可以直接用STUDENT定义变量,
//STUDENT s1,s2;
2.存储:
结构变量的存储分配与计算机系统及所定义的结构有关。为了提高CPU的存储速度,多数编译系统对结构中成员变量的存储分配采用按字节“对齐”的方法。分配原则如下:
- 各成员按照定义顺序依次存放,但并不是紧密排列,成员的存储位置存储在自己宽度的整数倍上开始。
- 检查所有成员的存储长度之和是否为成员中最宽的,元素长度的整数倍,若不是,则补齐为整数倍。
3.初始化与引用
初始化:结构类型 结构变量名={初始值表};
引用:结构变量是用 . 运算符和成员名字访问其成员
4.使用规则
- 对于整个结构,可以做赋值,取地址,也可以传递给函数参数,如
struct point
{
int x;
int y;
}p1,p2;
p1=(struct point){5,10};//相当于p1.x5;p1.y=10;
p2=p1;//相当于p2.x=p1.x;p2.y=p1.y;
- 不能将一个结构变量作为一个整体进行输入和输出;只能对其各个成员分别进行操作
- 若成员本身又属于一个结构体类型,只能对最低级的成员进行存取及运算
- 队成员变量可以向普通变量一样进行各种运算
- 可以引用成员的地址,也可以引用结构体变量的地址
- 与数组不同,结构变量的名字不是其地址,如果想获得其地址,需要使用&运算符。
结构数组
1.定义
struct
结构类型名
{
成员列表;
};
struct 结构类型名 结构数组名[尺寸];
2.初始化和引用
结构数组的初始化一般形式是在定义数组的后面加上={初值表列},也可在声明结构类型的同事定义数组并完成初始化
引用时使用下标进行访问,要访问某个具体元素的成员,又要使用 . 和成员名
结构指针
1.指向结构变量的指针
struct 结构类型名 *结构指针变量名;
结构变量的名字并不是结构变量的地址,必须使用&运算符
struct student
{
int number;
char name[15];
float score[3];
}x,*p;
p=&x//p=x错误
引用结构变量x的成员有三种方法:
- x.成员名
- (*p).成员名
- p->成员名
2.指向结构数组的指针
struct student
{
int num;
char name[15];
float score[3];
};
struct student stu[5],*p;
p=stu;//或者p=&stu[0];
引用:
- p->score[0];
- stu[0].score[0];
- p+1指向下一个结构数组元素stu[1],p+2指向的是stu[2]的首地址
结构类型数据在函数间的传递
1.结构变量作为函数参数
- 整个结构作为函数的参数
将结构作为整体,在函数之间传递整个结构;在被函数内新建一个结构变量,并接受调用者的值 - 结构成员作为函数的参数
在函数之间传递成员的值,与传递简单变量相同 - 函数也可以返回一个结构
2.结构指针变量作为函数参数
- 向函数传递的是结构的首地址
- 形参可以是结构数组,传递的是结构指针的值
- 传入传出只是一个指针的大小,而不是整个结构
- 函数返回一个结构指针
3.结构数组作为函数参数 - 向函数传递的是结构数组的首地址
- 形参可以是结构数组,也可以是结构指针
- 仅复制结构的首地址,这种按地址传递方式效率更高