C语言初阶之初识结构体

前言

在生活中,我们通常从不同的方面收集或者描述人、事、物的信息,例如收集一个学生的信息,需要包括学号、姓名、性别、年龄;描述一本书的信息,需要包括书号、书名、价格等。那我们有没有可能在程序中描述这些信息呢?在本章将和大家一起认识一个新朋友—结构体,并希望大家了解他的特性!

1.结构体的声明

1.1结构体的基础知识

数组—一组相同类型的元素的集合。
结构体是一些值的集合,这些值成为成员变量。结构的每个成员可以是不同类型的集合。

1.2结构的声明

struct tag//tag是结构名,是可以根据需求改变的
{
	member - list;//成员列表1~N
}variable-list;//结构体变量1~N

例如描述一个学生的结构体:

typedef struct Stu
{
	char no[10];//学号
	char name[20];//姓名
	char sex[10];//性别
	int age;//年龄
}Stu;

typedef是C语言的关键字,作用是为一种数据类型更改新名称,包括C语言自带的数据类型(如int、char等)和自定义的数据类型(如结构体类型等)。

1.3结构体成员的类型

结构体的成员可以是变量、数组、指针,甚至可以是其他结构体。

1.4结构体变量的定义和初始化

//①先声明结构类型,再定义结构变量
struct Stu 
{
	char no[10];//学号
	char name[20];//姓名
	char sex[10];//性别
	int age;//年龄
};
struct Stu s1;//定义结构体变量
s1 = { "00001","zhangsan","nan",20 };//初始化

//②声明结构类型的同时定义结构体变量
struct Stu 
{
	char no[10];//学号
	char name[20];//姓名
	char sex[10];//性别
	int age;//年龄
}s2;
s2 = { "00002","lisi","nan",21 };//初始化

//③直接定义结构变量
struct  
{
	char no[10];//学号
	char name[20];//姓名
	char sex[10];//性别
	int age;//年龄
}s3;//一般不建议这样写
s3 = { "00003","wangwu","nan",22 };//初始化
//由于省去了结构名,再该定义语句后面无法再定义
//这个类型的其他结构体变量;除非加上结构名或者
//再次直接定义结构变量

//④结构体嵌套初始化
struct Point
{
	char no[10];//学号
	char name[20];//姓名
};
struct Stu
{
	struct Point p;//结构体
	char sex[10];//性别
	int age;//年龄
}p1;
p1 = { {"00007","liuliu"},"baomi",18 };

//⑤结构体全局变量与结构体局部变量
struct Stu
{
	char name[20];
	int age;
}s1;//结构体全局变量
#include<stdio.h>
int main()
{
	struct Stu s2;//结构体局部变量
	return 0;
}

2.结构体成员的访问

  • 结构体变量访问成员,结构体变量是通过操作符(.)。点操作符接收两个操作数。

eg1:

#include<stdio.h>
struct Stu
{
	char name[20];
	int age;
};
int main()
{
	struct Stu s;
	strcpy(s.name, "zhangsan");
	s.age = 20;
	printf("%s %d\n", s.name, s.age);
	return 0;
}

图形理解:
在这里插入图片描述
代码运行结果:
在这里插入图片描述
结构体指针指向变量的成员:
eg2:

struct Stu
{
	char name[20];
	int age;
};
void Print(struct Stu* p)//用结构体指针接收
{
	printf("name=%s age=%d\n", (*p).name, (*p).age);
	//使用结构体指针访问指向对象的成员
	printf("name=%s age%d\n", p->name,p->age);
}
#include<stdio.h>
int main()
{
	struct Stu s = { "zhansan",20 };
	Print(&s);//把结构体变量的地址传过去
	return 0;
}

代码运行的结果:
在这里插入图片描述
总结:

//结构体数组:struct 结构名 数组名
//使用方式:
//①结构体数组名[下标].成员名
//②(*(结构数组名+下标)).成员名
//③(结构数组名+下标)->成员名
//结构体指针:struct 结构名 *指针变量名
//使用方式:
//①结构指针变量名.成员名
//②(*结构指针变量名).成员名
//③结构指针变量名->成员名

3.结构体传参

eg:

struct Stu
{
	char name[20];
	int age;
};
void Print1(struct Stu s)
{
	printf("name=%s age%d\n", s.name,s.age);
}
void Print2(struct Stu* p)//用结构体指针接收
{
	//使用结构体指针访问指向对象的成员
	printf("name=%s age%d\n", p->name,p->age);
}
#include<stdio.h>
int main()
{
	struct Stu s = { "zhansan",20 };
	Print1(s);//传结构体--传值调用
	Print2(&s);//把结构体变量的地址传过去--传址调用
	return 0;
}

代码运行的结果:
在这里插入图片描述
上面的代码中Print1和Print2函数哪个好些呢?
答案是:首选Print2函数。

原因:函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数的压栈的系统开销比较大,所以会导致性能的下降。

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

总结

本章我们一起学习了

1.结构体的声明、定义及初始化
2.结构体成员的访问
3.结构体的传参

希望对大家了解结构体特性 有些许帮助,相信有了结构体这个好朋友的帮助,在学习C语言的道路上会轻松不少!最后感谢大家阅读,如有不对,欢迎纠正噢!

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值