【C语言】结构体的作用

举报
謓泽 发表于 2023/09/24 14:31:59 2023/09/24
【摘要】 结构体和其他类型基础数据类型一样,例如 int 类型,char 类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。 

结构体的作用:

结构体和其他类型基础数据类型一样,例如 int 类型,char 类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。 

在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。  

结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。

结构体的大小与内存对齐:

结构体的大小不是结构体元素单纯相加就行的,因为我们现在主流的计算机使用的都是 32Bit 字长的 CPU,对这类型的 CPU 取 4 个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素是就会相对更高效,这就是内存对齐的由来


结构体成员的类型 

结构体成员的类型,可以是变量数组指针,甚至是其它的结构体,这里就不每个去列举了。

结构体成员

  • 结构体变量的访问成员,是通过操作符(.)访问的

 结构体(套娃‘doge’)

 在结构体成员类型中我说了下,但有些小伙伴可能会有点不清楚,在这里我把代码给大家,注意:   在上面结构体我使用了红色字体所标注的.

#include<stdio.h>
//学生家地址
struct address
{
	char T [20];
};
//描述一个学生
typedef struct student	//typedef —— 可以使用它来为类型取一个新的名字
{
	char name[20];		//学生名字
	char sex[5];		//学生性别
	char id[20];		//学生学号
	short int age;		//学生年龄
	struct address S;
}student;				//注意:对结构体类型进行重命名
int main(void)
{
	// struct student mation;// mation —— 结构体类型的变量
	student mation = { "法外狂徒张三", "man", "10086", 18, {"康达小区三懂一单元"} };
	printf("%s\n", mation.name);
	printf("%s\n", mation.sex);
	printf("%s\n", mation.id);
	printf("%d\n", mation.age);
	printf("%s\n", mation.S.T);//注意,由于我们是把一个结构体类型放在另一个结构体,所以这里需要找两次。

	return 0;
}

结构体传参和传值

在结构体成员类型中我说了下,但有些小伙伴可能会有点不清楚,在这里我把代码给大家,注意:   在上面结构体我使用了红色字体所标注的.

#include<stdio.h>
//学生家地址
struct address
{
	char T [20];
};
//描述一个学生
typedef struct student	//typedef —— 可以使用它来为类型取一个新的名字
{
	char name[20];		//学生名字
	char sex[5];		//学生性别
	char id[20];		//学生学号
	short int age;		//学生年龄
	struct address S;
}student;				//注意:对结构体类型进行重命名
int main(void)
{
	// struct student mation;// mation —— 结构体类型的变量
	student mation = { "法外狂徒张三", "man", "10086", 18, {"康达小区三懂一单元"} };
	printf("%s\n", mation.name);
	printf("%s\n", mation.sex);
	printf("%s\n", mation.id);
	printf("%d\n", mation.age);
	printf("%s\n", mation.S.T);//注意,由于我们是把一个结构体类型放在另一个结构体,所以这里需要找两次。

	return 0;
}

结构体传参和传值

 1.传参

注意,在print函数当中记得定义结构体关键字。 

#include<stdio.h>
//描述一个学生
typedef struct student	//typedef —— 可以使用它来为类型取一个新的名字
{
	char name[20];		//学生名字
	char sex[5];		//学生性别
	char id[20];		//学生学号
	short int age;		//学生年龄
}student;				//注意:对结构体类型进行重命名

void print(student tmp)
{
	printf("%s\n", tmp.name);
	printf("%s\n", tmp.sex);
	printf("%s\n", tmp.id);
	printf("%d\n", tmp.age);
}

int main(void)
{
	// struct student mation;// mation —— 结构体类型的变量
	student mation = { "法外狂徒张三", "man", "10086", 18 };
	//实现传参
	print(mation);

	return 0;
}

2.传址

注意:print2函数中打印的,-> (操作符)。在这里tmp2指针箭头指向对象的内容。

#include<stdio.h>
//描述一个学生
typedef struct student	//typedef —— 可以使用它来为类型取一个新的名字
{
	char name[20];		//学生名字
	char sex[5];		//学生性别
	char id[20];		//学生学号
	short int age;		//学生年龄
}student;				//注意:对结构体类型进行重命名
void print2(student *tmp)
{
	printf("%s\n", tmp->name);
	printf("%s\n", tmp->sex);
	printf("%s\n", tmp->id);
	printf("%d\n", tmp->age);
}
int main(void)
{
	// struct student mation;// mation —— 结构体类型的变量
	student mation = { "法外狂徒张三", "man", "10086", 18 };//结构体成员变量进行初始化
	//实现传址
	print2(&mation);
	return 0;
}

注→结构体指针实际上指向的就是结构体类型当中成员变量的地址。就一句话。

各位,这两个函数如果要选择一个的话,选择第2个。因为: 

  1. 传参:如果当我们用实参传递给形参的话,其实就是一份临时拷贝。这样的话就要把所有的数据内存空间给再copy一份下去。放在其它的内存上,在这里我取名为tmp。就很简单就是例如,是200个字节那么你传的参数就也要两百个字节,这就会导致空间的一个浪费就会非常严重滴,同时你copy过去还需要一定的时间
  2. 传址:这里我传过去的仅仅是地址(&),一个地址就是4字节(32位)8个字节(64位),注意这里是int类型的数据类型所以是4个字节以及32个比特位,用三十二位的二进制来进行表达。

如果要选择一种,我们尽可能的去选择传址,因为效率更高些,而且还可以省出一定内存空间,尤其是对大型项目的看法,两种我们就可以去选择传址。

结论:当结构体传参的时候要传入结构体的地址。


好,那么本篇博客就带大家如何去学习结构体初始了,那么觉得本篇博客对你起到帮助的话,记得给博主一个点赞,当然能三连我会更开心的。其实写博客也算是对以前的知识点的一个总结吧,加油。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。