C语言结构体(struct)类型的各种用法

一、基本概念

在C语言中,可以定义结构体类型,将多个相关的类型的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。在C语言中,结构体不能包含函数。

二、结构体定义的三种方式(声明后有不能忘了;号)

1、标准定义方式

#include <stdio.h>

//结构体类型的声明与定义分开
struct student 
{
	int age;  //年龄
	float score; //分数
	char sex;   //性别
};  //结构体类型声明结束

int main ()
{
	//结构体类型变量的定义
	struct student a={23, 98, 'f'}; 
	
	printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );
	return 0;
}

2、声明结构体时定义变量(不环保)

#include <stdio.h>

//在结构体的声明时直接定义变量
struct student 
{
	int age;  //年龄
	float score;  //分数
	char sex;   //性别
} a={23, 87,'n'};  //声明结构体时直接定义变量a,并赋初值

int main()
{
	//在main函数中直接调用定义好的结构体变量a
	printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );
}

3、无类型名的结构体(此法最差,只能用一次)

#include <stdio.h>

//直接定义结构体变量,没有结构体类型名
struct   
{
	int age;
	float score;
	char sex;
} t={23, 98, 'f'};

int main ()
{
	printf("年龄:%d 分数:%f 性别:%c\n", t.age, t.score, t.sex);
	return 0;
}

4、用typedef给自定义的结构体加一个名字(typedef 已有类型 新类型名)

#include <stdio.h>

//在结构体的声明时直接定义变量
typedef struct student 
{
	int age;  //年龄
	float score;  //分数
	char sex;   //性别
};  //声明结构体时直接定义变量a,并赋初值

int main()
{
	//定义结构体变量
	student a={23, 87,'n'};  //此时就可以直接用student这个类型名了
	//在main函数中直接调用定义好的结构体变量a
	printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );
}

三、访问结构体成员

用结构成员运算符点“ . ”就可以了:结构体变量名.成员名;
注意,点其结合性是自左至右的,它在所有的运算符中优先级是最高的。
1、一维数组
比如声明了一个结构体student,定义了一个变量stu:

struct student
{
	char name[10];  //相当于一个字符串,即char型数组
	int num;  //int型数据,编号
	int age;  //年龄
	float score[3];  //3门课的分数
	char sex;  //性别
} stu;

在这个结构体中,如果要访问第二门课的分数,则需要这样访问:

//输入:
scanf("%f", &stu.score[1]);  //取的是第二门课成绩的地址
//输出:
printf("%f", stu.score[1])  //输出的是第二门课成绩

2、二维数组(同理)
比如声明了一个结构体student,定义了一个变量stu:

struct student
{
	char name[10];  //相当于一个字符串,即char型数组
	int num;  //int型数据,编号
	int age;  //年龄
	float score[3][2];  //3门课的分数,都有两次测验
	char sex;  //性别
} stu;
//输入:
scanf("%f", &stu.score[1][1]);  //取的是第二门课第二次测验成绩的地址
//输出:
printf("%f", stu.score[1][1])  //输出的是第二门课第二次测验的成绩

3、其他更高维数组的用法都是一样的道理,以此类推。

四、结构体数组

比如声明了一个结构体student,定义了一个结构体变量数组stu[3]:

struct student
{
	char name[10];  //相当于一个字符串,即char型数组
	int num;  //int型数据,编号
	int age;  //年龄
	float score[3][2];  //3门课的分数,都有两次测验
	char sex;  //性别
} stu[3];

这里的stu就是一个结构体数组,包含了3个student类型的结构体变量。
接下来我们试着访问第3个结构体变量的第1门课第2次测验的成绩:

//输入:
scanf("%f", &stu[2].score[0][1]);  //取的是第三个结构体变量第一门课第二次测验成绩的地址
//输出:
printf("%f", stu[2].score[0][1])  //输出的是第三个结构体变量第一门课第二次测验的成绩

五、结构体的嵌套

比如声明了一个结构体student,里面包含了一个结构体GoodStudent,里面声明了好学生的名字和成绩,同时定义了一个结构体变量数组stu[3]:

struct student
{
	int num;  //int型数据,编号
	int age;  //年龄
	char sex;  //性别
	struct GoodStudent
	{
		char name[10];  //相当于一个字符串,即char型数组
		float score[3][2];  //3门课的分数,都有两次测验
	}
} stu[3];

此时要访问结构体GoodStudent好学生中的成绩,仍然是用“ . ”成员访问符来访问。

比如要访问第2个结构体变量的好学生的第2门课第1次测验的成绩:

//输入:
scanf("%f", &stu[1].GoodStudent.score[1][0]);  //取的是第2个结构体变量的好学生的第2门课第1次测验的成绩的地址
//输出:
printf("%f", stu[1].GoodStudent.score[1][0])  //输出的是第2个结构体变量的好学生的第2门课第1次测验的成绩成绩
  • 21
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鸿蒙Next

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

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

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

打赏作者

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

抵扣说明:

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

余额充值