C语言——结构类型与结构变量

8 篇文章 0 订阅

思考: 如果现在希望保存一个学生的所有信息,该如何保存?
姓名、年龄、身高、体重、成绩…
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;


	return 0;
}
【说明】
			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);
	}
	return 0;
}

八、指针和结构体的关系
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
  • 16
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值