C语⾔——结构类型与结构变量
思考: 如果现在希望保存⼀个学⽣的所有信息,该如何保存?
姓名、年龄、⾝⾼、体重、成绩…
char stu[100] = “xiaoming|22|175|65|59”:
在现实⽣活中,有很多的⼀组的数据,⽐如学⽣(姓名、年龄、⾝⾼、体重、成绩.),员⼯(姓名、年龄、性别、已婚、未婚、⼯龄),⾥⾯的属性不⼀定都是相同的类型。使⽤构造数据类型——结构体类型。
⼀、什么是结构类型
结构类型是⼀种⾮常有⽤的类型,是今后学习“类”类型的基础,可⽤来描述现实⽣活中具有多种属性的实体。如学⽣有“学号”、“姓名”、“性别”以及各门课的“成绩”等属性。结构体可以⽤来保存相同的类型,也可以保存不同的类型。
⼆、结构类型的定义
结构体内部的元素,也就是组成成分,我们⼀般称为"成员"。
定义⼀个结构体的⼀般形式为:
struct 结构类型名
{
数据类型成员1;
数据类型成员2;
数据类型成员3;
……
数据类型成员n;
};
struct是关键字,是结构体类型的标志。
2.举例
定义⼀个叫做Student的结构体,共有name、num、age、sex4个成员。
//定义了⼀个保存学⽣信息的结构体类型
struct stuInfo
{
char name[20];//名字
int num;//学号
int age;//年龄
char sex;//性别
};
int main(void)
{
/
/通过struct stuInfo 定义结构体变量
struct stuInfo stu1, stu2;
return0;
}
【说明】
1) struct 关键字,表⽰现在定义的是⼀个结构体类型,定义结构类型
其实是在创造类型。
2) 结构类型名,创建的结构类型的名字,是⼀个标⽰符
3) {}⾥⾯可以创建多个数据项,这个数据的类型,可以是简单的数据
类型,也可以是构造数据类型,⽐如:数组,结构体;
【注】:
1)创建类型,这个类型,包括多个不同类型的变量,复杂的数据
类型,这个创建的类型,本⾝是不会占⽤内存空间,创建结构体类型
——————只是相当于画了⼀张图纸。
2)在定义结构体类型的时候,数据项不能够被赋值。
结构定义之后,即可进⾏变量说明。凡说明为结构stuInfo的变量都由上述4个成员组成。 由此可见, 结构是⼀种复杂的数据类型,是数⽬固定,类型不同的若⼲有序变量的集合。
三、结构类型变量的定义
1. 间接定义法——先定义结构体类型,再定义变量
struct stuInfo
{
char name[20];//名字
int num;//学号
int age;//年龄
char sex;//性别
};
通过结构类型 struct stuIfo , 创建结构体变量
struct stuInfo 变量名;
struct stuInfo stu1, stu2, stu3, ….
2.直接定义法——在定义结构类型的同时说明结构变量。
这种形式的说明的⼀般形式为:
struct stuInfo
{
char name[20];
int num;
int age;
char sex;
}stu1, stu2, stu3,…;
3.直接定义法——直接定义结构体类型变量,省略类型名
struct {
char name[20];
int num;
int age;
char sex;
}stu1, stu2, …;
这个创建结构体变量的⽅式,没有定义结构体类型;
所以不能够在代码后⾯,重新去定义新的结构体变量。
四、结构体变量和初始化
和其他类型变量⼀样,对结构变量可以在定义时进⾏初始化赋值。
struct stuInfo
{
char name[20];
int num;
int age;
char sex;
};
struct stuInfo stu1 ={“zhangsan”,1,20, ‘m’};
struct stuInfo stu2 ={“lisi”,2,22, ‘f’};
只能在定义变量的同时进⾏初始化赋值,初始化赋值和变量的定义不能分开,下⾯的做法是错误的:
struct stuInfo stu;
stu ={“lisi”,2,22, ‘f’};
【注】:
1.不允许对结构体本⾝递归定义
2.结构体内可以包含别的结构体
3.定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本⾝分配空间⼀样。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量
4.结构体变量占⽤的内存空间是其成员所占内存之和,⽽且各成员在内存中按定义的顺序依次排列
五、结构体成员的表⽰⽅式
在程序中使⽤结构变量时,往往不把它作为⼀个整体来使⽤。⼀般对结构
变量的使⽤,包括赋值、输⼊、输出、运算等都是通过结构变量的成员来实现的。
表⽰结构变量成员的⼀般形式是:
‘.’ 结构体成员变量运算符
结构体变量.成员(stu1.name)
六、结构变量的赋值
结构变量的赋值就是给各成员赋值。可⽤输⼊语句或赋值语句来完成。
输⼊语句:
scanf(“%s”, stu1.name);
scanf(“%d”, &stu1.age);
scanf(“%d”, &stu2.age);
赋值语句:
stu1.age = 20;
stu2.num = 2;
七、结构体数组
数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每⼀个元素都是具有相同结构类型的下标结构变量。在实际应⽤中,经常⽤结构数组来表⽰具有相同数据结构的⼀个体。如⼀个班的学⽣档案,⼀个车间职⼯的⼯资表等。
结构体数组的定义⽅式
结构类型说明符 数组名[常量表达式];
结构类型说明符: 表⽰现在定义的是⼀个结构体数组;
数组名: 结构体数组的名字,是⼀个标识符
常量表达式: 数组的元素个数。
//赋值3本书的名称等信息,然后按照每⾏⼀本书的信息输出。
struct bookInfo
{
char name[20];
char author[20];
float price;
char publish[20];
};
int main(void)
{
struct bookInfo book[3]={};
for(int i =0; i <3; i ++)
{
printf("请输⼊第%d本书的信息:\n", i +1);
printf("name: ");
scanf("%s", book[i].name);
printf("author: ");
scanf("%s", book[i].author);
printf("price: ");
scanf("%f",&book[i].price);
printf("publish: ");
scanf("%s", book[i].publish);
}
for(int i =0; i <3; i ++)
{
printf("第%d本书的信息如下:\n", i +1);
printf("name: %s, author: %s, price: %.2f, publish: %s\n", book[i].name, book[i].author, book[i].price, book[i].publish);
}
return0;
}
⼋、指针和结构体的关系
1、结构体指针
结构体变量,在内存中的地址———结构体指针。
2、结构体指针变量
⼀个指针变量当⽤来指向⼀个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的⾸地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。
结构指针变量说明的⼀般形式为:
结构体类型说明符 *变量名;
例如:
struct stuInfo *p;
//声明了⼀个指针变量p, p⽤来保存struct stuInfo 类型结构体变量的指针。
可以对指针变量进⾏初始化:
struct stuInfo *p = NULL; //空指针
struct stuInfo stu;
struct stuInfo *pstu = &stu;
通过结构体指针访问成员变量的⼀般形式为:
pstu->name, 访问stu的name,类型:字符数组
pstu->num 访问stu的num, 类型: int
pstu->age, 访问stu的age, 类型:int
pstu->sex, 访问stu的sex, 类型:char
(*pstu).name
指针变量的定义格式(*pstu).num
(*pstu).age
(*pstu).sex
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论