- 结构体
1.1结构体类型的定义
1.2结构体变量的定义和引用
1.3结构体变量的赋值
1.4结构体变量内存分配问题透析
1.5简化结构体类型名
1.6结构体数组
1.1结构体类型的定义
什么是结构类型?
把不同或相同类型数据项组织成一个整体这就是结构类型。
结构体类型的格式是什么?
代码示例:
struct Student_Info{
char no[9]; //学号
char name[20]; //姓名
char sex; //性别
unsigned int age; //年龄
unsigned int classno; //班级
float grade; //成绩
};//这里定义了一个结构类型 struct Student_Info,其中struct一个结构类型,Student_Info是结构名
结构体定义注意事项:
struct不能省略;最后以;结尾;结构体本身不占用内存,只有用它来定义变量时,系统才会为该变量分配内存。就像int不占内存,int a;中变量a占内存。
1.2结构体变量的定义和引用
如何进行结构体变量的定义?
有两种方法:间接定义法和直接定义法
间接定义法:先定义结构体类型,再定义结构体变量
代码示例:
struct Student_Info{
char no[9]; //学号
char name[20]; //姓名
char sex; //性别
unsigned int age; //年龄
unsigned int classno; //班级
float grade; //成绩
};
struct Student_Info student1;
注意事项:不能省略关键字,如Student_Info student1;
不能没有结构名,如struct student1;
先定义类型后定义变量
直接定义法:定义完类型后直接跟上变量名
代码示例:
struct Student_Info{
char no[9]; //学号
char name[20]; //姓名
char sex; //性别
unsigned int age; //年龄
unsigned int classno; //班级
float grade; //成绩
};student1;
如何进行结构体变量的引用?
结构体变量名.成员名
结构体指针->成员名 或 (*结构体指针).成员名
其中.和->是结构体成员引用运算符,->之间不能有空格。
代码示例:
struct Student_Info stu;
struct Student_Info * pstu;pstu=&stu; //指针 pstu指向 stu
strcpy(stu. name, "zhangMing"); //将"zhangMing"复制到 stu 的 name成员中
stu. grade=80; //对 stu 的成员 grade赋值为 80
pstu-> grade+=10; //将 stu 的成员 grade 的值增加 10
printf("%s %f", stu. name,(*pstu). grade); //输出 stu 的成员 name 和 grade 的值
如果结构体成员本身就是结构体类型,则多级分量运算至最低级子成员名
结构体变量名.成员名.子成员名. ... .最低级子成员名
代码示例:
struct Stu_Info stu;
struct Stu_Info * pstu=&stu;
stu. birthday. year=1986; //对 stu的结构体类型成员 birthday 的成员 year赋值
stu. birthday. month=10; //对 stu的结构类型成员 birthday 的成员 month 赋值
pstu-> birthday. day=12; //对 stu的结构类型成员 birthday 的成员 day赋值
几点说明:
(1)结构体变量不能整体引用,只能引用其变量成员。
(2)可以将一个结构体变量赋值给另一个结构体变量,例如,stu1 = stu2;是合法的。
(3)既可以引用结构体成员的地址,也可以引用结构体变量的地址
代码示例:
&stu1; //表示结构体变量stu1所占内存单元的首地址
&stu1.grade //表示结构体变量stu1的成员grade所占内存单元的地址
1.3结构体变量的赋值
如何对结构体变量初始化赋值?
- .先定义结构体类型,再定义结构体变量时赋初始值。格式如下:
注意:赋值时成员的顺序必须和定义结构体类型时成员名的顺序相同。
如果是结构体嵌套,则初始化赋值时在该特定位置时嵌套一个{}。
- 定义结构体类型的同时,定义结构体变量并赋初始值。格式如下:
代码示例:
struct date{
Int year,month,day;
}birthday = {2005,02,16};
如何让结构体变量在程序中赋值?
如果在定义结构体变量时并未对其赋初始值,那么在程序中要对他赋值的话,就只能一个一个地对其成员逐一赋值,获知用已赋值的同类型的结构体变量对它赋值。
代码示例:
struct Student_Info stu; //只定义了结构体变量 stu,并未对其赋初始值
//以下通过语句对 stu 的各个成员逐一赋值
strcpy(stu. no, "20020306");
strcpy(stu. name, "ZhangMing");
stu. sex='M';
stu. age=18;
stu. classno=1;
stu. grade=90;
//如果再定义一个结构体变量 stul,那么也可以将上面赋值后的stu赋值给 stul。
struct Student_Info stul;
stul=stu;
//执行后的结果将是把 stu 的各个成员的值复制给 stul 对应的成员,相当于执行下列语句:
strcpy(stul. no, stu. no);
strcpy(stul. name, stu. name);
stul. sex=stu. sex;
stul. age=stu. age;
stul. classno=stu. classno;
stul. grade=stu. grade;
//当然也可以用 memcpy函数来替代,其具体写法为:
//memcpy(&stul, &stu, sizeof(struct Student_Info));
注意:(1)对结构体变量不可以整体赋值。
(2)不同结构体类型(成员及顺序不同)的结构体变量之间不能赋值。
1.4结构体变量内存分配问题透析
略
1.5 简化结构体类型名
用typedef语句,格式如下:
typedef 类型名 类型名的别名
注意: ·类型名必须是已经定义的数据类型名或C语言提供的基本类型名。
·类型名的别名必须是合法的标识符,通常用大写字母来表示。
·typedef 语句要以分号结尾。
·可以用类型名的别名代替类型名来定义变量。
代码示例:
typedef int INTEGER; //INTEGER是别名
typede f ch ar * STRING //STRING 是别名
struct teacher_info
{
char name[20], char sex, unit[30];
unsigned int age, workyears;
float salary;
};
typede f struct teacher_info TEACHER; //TEACHER是别名
INTEGER a; //相当于 int a;
STRING str; //相当于 char * str;
TEACHER t; //相当于 struct teacher_info t;
//如果要为数组取别名,必须在typedef语句中将数组的大小写在别名的后面。例如:
typede f char ARRAY[81]; //ARRAY 是别名
ARRAY str; //相当于 char str[81];
1.6结构体数组
什么是结构体数组?
如果数组元素时结构体类型的数据(本来一般是int 或者char类型的数据),那么这种数组就是结构体数组。结构体数组的每一个元素都是具有相同结构体类型的下表结构变量
name | sex | age | classno | grade |
... | ... | ... | ... | ... |
... | ... | ... | ... | ... |
... | ... | ... | ... | ... |
表格的框架相当于结构体类型,每一列相当于成员,每一行的信息对应该结构体数组元素各成员的具体值,行数对应的是数组长度
结构体数组如何初始化?
格式如下:
代码示例:
struct Student_Info stu[3]={{"20020306", "ZhangMing", 'M', 18, 1, 90},
{"20020307", "WangHai", 'M', 17, 1, 85},
{"20020308", "LiHong", 'F', 18, 2, 95}};
//又如:
struct Man_Info //Man_Info也可省略
{
char name[20];
struct Date {int year, int month, int day} birthday;
} man[]={ {"ZhangXiang", {1986, 10, 29}},{"WangFei", {1987, 12, 10}} };
结构体数组如何引用?
格式如下:
结构体数组名[下标].成员名;
代码示例:
struct Student_Info stu[3];
strcpy(stu[0]. name, "WangFei"); //对数组元素 stu[0]中的成员 name赋值
stu[1]. grade++; //对数组元素 stu[l]中的成员 grade 增1
printf("%s", stu[0]. name); //显示数组元素 stu[0]中的成员 name的值
结构体数组应用的代码示例:
统计候选人选票。
#include <stdio. h>
#include < string. h>
struct person
{
char name[20];
int count;
} leader[3] =("Li", 0, "Zhang", 0 , "Wang",0};
int main( ){
int i,j;
char leader_name[20];
while(1) //统计候选人得票数
scanf("%s", leader_name) ;//输入候选人姓名
if(strcmp(leader_name, "0") ==0) //输入为"0"结束
break;
for(j =0; j<3;j++) //比较是否为合法候选人
if(strcmp(leader _name, leader [ i ].name) ==0) //合法
leader[ j ]. count++ //得票数加1
for(i=0;i<3; i++) //显示候选人得票数
printf("%5s %d\n", leader[i] ,.name, leader[i] .count);
return 0;}