首页 > 其他分享 >结构体详解

结构体详解

时间:2023-02-23 19:32:19浏览次数:26  
标签:变量 grade name stu 详解 结构 struct

这是一篇介绍C语言结构体基本知识的博客,包含结构体声明,笔者在使用时曾犯过的一些错误等。

一、背景

在编程中,我们常会遇到一些复杂对象,其中包含各种类型的数据,而我们又需要将其整合为一个对象时,便可以用到结构体。 例如:在学校里描述一个学生的成绩时,一个学生需要包含姓名、成绩、班级等信息,于是我们便可以采用结构体,使得代码更清晰。

struct stu
{
	char name[20];//姓名
	int class;//班级
	float grade;//成绩
}S1,S2;
//S1,S2为struct stu类型的全局变量

二、结构体的使用

1、结构体定义

用户自己指定这样一种数据结构,它由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的,这样的数据结构称为结构体; struct后跟——结构体名; 结构体内部的变量称为——成员变量。 上述例子中,结构体名为stu,成员变量有name,class,grade。

2、结构体类型变量定义的两种方法

a、声明结构体类型,再定义结构体变量;

上述举例时,便采用此方法。

b、直接定义结构类型变量;

即不出现结构体名。

struct 
{
	char name[20];//姓名
	int class;//班级
	float grade;//成绩
}S1,S2;
//此时S1,S2作为结构体类型变量,可以通过调用S1,S2访问其中的成员变量,
//但不可以再以struct 定义新变量,因为并没有创建新的结构体类型,
//只创建了结构体类型变量

3、结构体的访问

a、采用结构体名

. 点操作符

b、采用指针

-> 箭头操作符

ypedef struct stu
{
	char name[20];//姓名
	int class;//班级
	float grade;//成绩
}Stu;
//Stu为typedef将struct stu类型改名为Stu
int main()
{
	struct stu zhangsan = { {"张三"}, 1, 80.0};
	struct stu* p = &zhangsan;
	//点操作符访问
	printf("%s ", zhangsan.name);
	printf("%d ", zhangsan.class);
	printf("%0.2f\n", zhangsan.grade);
	//箭头操作符访问
	printf("%s ", p->name);
	printf("%d ", p->class);
	printf("%0.2f\n", p->grade);
	return 0;
}

输出为 image.png

三、常犯错误

  • C语言中,struct + 结构体名 才是定义结构体变量,struct不可随便省略; 若要省略,可用typedef将此结构体类型重新命名。 例如:在本文例子中,可稍作更改->
typedef struct stu
{
	char name[20];//姓名
	int class;//班级
	float grade;//成绩
}Stu;
//Stu为typedef将struct stu类型改名为Stu
Stu S1, S2;
//此时S1,S2仍为struct stu类型的全局变量

在学习数据结构时,常会出现以typedef将结构体类型重新取名的情况。  

  • 结构体中的成员变量名可以和结构体类型名相同,二者代表不同对象; 例如:
struct 
{
	char name[20];//姓名,此时name仅做为结构体中的成员变量。
	int class;//班级
	float grade;//成绩
}S1,name;//此时name为结构体类型变量

  • 在定义函数需调用结构体时,尽量采用指针调用,避免空间浪费; 原因是函数传参的时候,参数需要压栈。 如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。 也就是说值传时,实参传给形参,形参作为实参的一份临时拷贝,会创建一份重复的变量,占用内存空间,而采用指针,访问原结构体的地址,便不会如此。

标签:变量,grade,name,stu,详解,结构,struct
From: https://blog.51cto.com/u_15423682/6081736

相关文章