结构体 struct

结构体(Struct)

我们用得多的是数组,它是一组具有相同类型的数据的集合。但当需要一组不同类型的数据时,怎么办?

这时候,就需要一种数据类型,能够让我们自己定义,来降服这些复杂的数据、表格等等。

数据类型

基本数据类型:int、float、char 等,不能再进行分拆

复杂数据类型或构造数据类型:结构体,可包含多个基本类型的数据,甚至是其他的结构体

定义:

struct 结构体名{
 	 结构体所包含的变量或数组;   //里面的每一项就叫:成员。
};

例如对于学生信息登记表,因为数据类型不同,显然不能用一个数组来存放。

struct stu{
	char *name;  	//姓名
	int num; 	 	//学号
	int age;  		//年龄
    char group;  	//所在学习小组
    float score; 	//成绩
};					//注意大括号后面的分号`;`不能少,这是一条完整的语句。

定义结构体变量

既然结构体是一种数据类型,那么就可以用它来定义变量。例如:

struct stu stu1, stu2;

定义了两个变量 stu1 和 stu2,它们都是 struct stu 类型。

定义结构体的同时定义结构体变量:

将变量放在结构体定义的最后即可。

struct stu{
	char *name;  	//姓名
	int num; 	 	//学号
	int age;  		//年龄
    char group;  	//所在学习小组
    float score; 	//成绩
}stu1, stu2;

定义匿名结构体变量

如下所示:这样做书写简单,但是因为没有结构体名,后面就没法用该结构体定义新的变量。

所以只能使用stu1,stu2

struct{ 		//这里没有写stu
	char *name;  	//姓名
	int num; 	 	//学号
	int age;  		//年龄
    char group;  	//所在学习小组
    float score; 	//成绩
}stu1, stu2;

成员变量的获取和赋值

结构体使用点号.获取单个成员。获取结构体成员的一般格式为:

结构体变量名.成员名;

1、获取成员的值,也可以给成员赋值:

#include <stdio.h>
int main(){ 
struct stu{ 		//
	char *name;  	//姓名
	int num; 	 	//学号
	int age;  		//年龄
    char group;  	//所在学习小组
    float score; 	//成绩
}stu1;

//给结构体成员赋值 

stu1.name = "Tom";
stu1.num = 12;
stu1.age = 18;
stu1.group = 'A';
stu1.score = 136.5; 

//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);}

2、除了逐一赋值,也可在定义时整体赋值。

struct{ 		
	char *name;  	//姓名
	int num; 	 	//学号
	int age;  		//年龄
    char group;  	//所在学习小组
    float score; 	//成绩
}stu1 = { "Tom", 12, 18, 'A', 136.5 };

不过整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。

struct和typedef struct有什么区别?

区别就在于使用时,是否可以省去struct这个关键字

未加typedef

struct student
{
	char num[10];
	char name[20];
	int	 age;
};
声明变量
struct student stu[10];

typedef是用来定义新的类型名来代替已有的类型名,

加typedef,可将上面的结构体定义为
typedef struct student{
	char num[10];
	char name[20];
	int age;
}stu1;

也就是说,将原来的struct student重新定义为stu1。

声明变量
stu1 stu[10]
//定义struct student
struct student{
    int num;
    int sex;
};
//定义struct teacher并加上typedef
typedef struct teacher{
    int num;
    int sex;
}teacher;

void main(){
//声明学生小明,并逐个赋值
    struct student XiaoMing;
    XiaoMing.num = 250;
    XiaoMing.sex = 1;
    printf("%d\n",XiaoMing.num);
//声明老师金城武,并一次性赋值
    teacher JinChengwu = {520,1};
    JinChengwu.num = 520;
    JinChengwu.sex = 1;
    printf("%d\n",JinChengwu.num);
}

struct的成员变量之间存在“裂缝”(存储原理)。

理论上讲结构体的各个成员在内存中是连续存储的,和数组非常类似,例如上面的结构体变量 stu1,共占用 4+4+4+1+4 = 17 个字节。

实际上,为达成统一大小,每一个给定了4个字节,但char只占1个。这样一来,就像土豪一挥手,给了20个房间,虽然你只需要住17个就够了,不过多就多了,who care。

需要注意的是,

结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;

结构体声明出的变量才包含了实实在在的数据,需要内存空间来存储。

posted @   Dinesaw  阅读(307)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示