C语言之结构体

学好结构体对于我们学习数据结构有很大的帮助,首先我们要先了解什么是结构体?以及为什么使用结构体。

什么是结构体

在C语言中,有系统给出的int double short char等类型供我们使用,但是C语言也规定可以由用户自己建立不同类型数据组合形成的组合型的数据结构,称为结构体

为什么使用结构体

在日常生活中,我们所接触到的数据大多数是彼此间有联系的,例如学号、姓名、性别、成绩、家庭住址等数据元素是同属于一个学生的,如果我们分别定义出这些变量,则很难统一它们的关联,那么数组可以完成这个功能吗?显然是不可以的,数组只是存放同一数据类型的元素集合。

这就需要用到结构体了

结构体的建立

struct student
{
	int num;
	char name[20];
	char sex;
	char addr[10];
};

这是我们自己建立的结构体类型,struct student是类型名(struct是在声明结构体时的关键字不能省略),经过创建后,struct student就是在系统中的一个可以合法使用的类型名,它包括num、name等成员

结构体声明

struct 结构体名
{
	//成员
};

结构体类型的名字是由关键字struct和结构体名组合而成,结构体名是由用户自己决定,又称为结构体标记,以区别其他结构体类型

 对与成员的定义应为:类型名 + 变量名;成员列表也称为域表,每一个成员都是结构体中的一个域

 结构体类型也可作为另一个的成员

struct brithday
{
	int month;
	int day;
	int year;
};
struct student
{
	int num;
	char name[20];
	char sex;
	char addr[20];
	struct brithday;//brithday作为student的一个成员
};

定义结构体类型变量

在前面我们只是创建了一个数据类型为结构体类型的数据,并未对其定义变量名,相当于建造一个房子,但是并未对其内修饰,我们可以使用下面3中方法对其进行定义

1、在声明结构体的同时定义变量名

	struct student
	{
		int num;
		char name[20];
		char sex;
		char addr[20];
		struct brithday;//brithday作为student的一个成员
	}stu1, stu2;
	

格式为:

struct 结构名
{
  //成员
}变量名;

2、先声明结构体类型,后定义其变量名

struct student
	{
		int num;
		char name[20];
		char sex;
		char addr[20];
		struct brithday;//brithday作为student的一个成员
	};
	
	struct student stu1, stu2;

此种方法就如我们平时定义一个变量如:int a;char ch;这样定义起来更加灵活方便

3、不指定结构体类型名而直接定义结构体变量

struct 
	{
		int num;
		char name[20];
		char sex;
		char addr[20];
		struct brithday;//brithday作为student的一个成员
	}stu1, stu2;
	

这种不指定结构名结构体类型,也可以称为匿名结构体类型

如果不对匿名结构体类型重命名,基本上也只能使用一次

struct
	{
	int x;
	char arr[10];
	float n;
	}x;
	struct 
	{
		int num;
		char name[20];
		char sex;
		char addr[20];
		struct brithday;//brithday作为student的一个成员
	}stu1, *p;
	
	p = &x;//这样把结构体的地址传给指向结构体类型的指针合法吗?

这样对匿名结构体像指针进行传址是不合法的,因为系统会把它们两个匿名结构体认为是同一个

结构体变量的初始化和引用

#include<stdio.h>

int main()
{

	struct student
	{
		int num;
		char name[20];
		char sex;
		char addr[20];
	}stu = {23020201, "lisi", 'M', "china"};
	
	printf("学号:%d\n姓名:%s\n性别:%c\n住址:%s", stu.num, stu.name, stu.sex, stu.addr);
	
	return 0;
}

对于结构体变量的初始化就是在一个集合内分别对其成员进行赋值,与对系统给定的类型定义变量并对其初始化是相同的。

我们也可以对某一个成员进行单独初始化:

struct student stu = {.name = "zhangsan"}; 
.(句点)运算符

对于结构体变量的引用如下:

结构体变量名.成员名

在程序中我们可以对成员进行赋值:

stu.sex = 'F';

" . "是成员运算符,在所要运算符中级别最高,因此可以把stu.sex作为一个整体,相当于一个变量

 注意

在输出结构体内的数据时,不能妄想只通过变量名就能输出所有成员的值:

printf("%d"\n, stu);
引用作为成员的结构体变量
#include<stdio.h>

int main()
{

	struct Date
	{
		int month;
		int day;
		int year;
	};
	

	struct student
	{
		int num;
		char name[20];
		char sex;
		char addr[20];
		struct Date brithday;
	}stu = {23020201, "lisi", 'M', "china"};
	
	printf("学号:%d\n姓名:%s\n性别:%c\n住址:%s\n", stu.num, stu.name, stu.sex, stu.addr);
	stu.brithday.month = 8;
	printf("%d", stu.brithday.month);
	
	return 0;
}

必须一级一级的引用,引用到最低级才能对Date的成员赋值以及引用

结构体成员运算
赋值运算
stu1.source = stu2.source;
 //假设都是结构体类型的变量
加法运算
sum = stu1.source + stu2.source;
递增(递减)运算
stu.age++

由于.(句点)运算符的优先级最高,因此是(stu.age)++的运算

 同类结构体变量可以进行相互赋值

假设student1和student2是相同的结构体类型,可以进行以下运算

student1 = student2;

输入结构体成员的数值

我们可以使用结构体成员的地址进行输入,也可以使用结构体变量名作为函数参数进行传参,即结构体名是此结构体的地址,与数组名类似。

scanf("d", &stu.source);

当结构体成员是数组时(数组名可看为地址):

scanf("%s", stu.name);

写一个程序:

有两名学生,使用结构体存放他们的学号、姓名、性别、语数英三门课成绩

#include<stdio.h>

int main()
{
	struct Student
	{
		int num;
		char name[20];
		char sex;
		double source[3];//语数英
	};
	
	struct Student stu1 = {23023201, "zhangsan", 'm'};
	struct Student stu2 = {23023202, "lisi", 'f'};
	
	int i = 0;
	
	for(; i < 3; i++)
	{
		scanf("%lf", &stu1.source[i]);
		scanf("%lf", &stu2.source[i]);
	}

	puts("显示stu1 stu2的信息");
	
	printf("学号:%d\n姓名:%s\n性别:%c\n三门课成绩:%lf %lf %lf\n", 
		  stu1.num, stu1.name, stu1.sex, stu1.source[0], stu1.source[1], stu1.source[2]);
	printf("学号:%d\n姓名:%s\n性别:%c\n三门课成绩:%lf %lf %lf\n", 
		stu2.num, stu2.name, stu2.sex, stu2.source[0], stu2.source[1], stu2.source[2]);
	
	return 0;
}

  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学海无涯.苦作舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值