【C语言详解】结构体

2022-04-02-

摘要

结构体的声明

结构体的初始化

结构体成员访问

结构体传参

总结

目录

结构体的声明

什么是结构

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

结构体的声明

struct tag
{
	member-list;
}variable-list;

结构体的作用

我们想用一个变量描述一个人,那如何实现呢?

C语言提供给我们的基础类型中,都是只能描述某一个方面。

然而人或者其他的复杂对象是多元的,需要很多变量去描述特征,那么结构体就能做到这件事。

例如描述一个学生:

typedef struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}Stu;

结构成员的类型

结构成员的类型可以是C语言提供给我们的基础类型,也可以是另一个结构体。

注意:这个结构体不能是结构体本身,否则会形成递归。

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

struct Point p3 = {x, y};
struct Stu     //类型声明
{
	char name[15];//名字
	int age;    //年龄
};
struct Stu s = {"zhangsan", 20};//初始化
struct Node
{
	int data;
	struct Point p;
	struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化

初始化方式与数组有些相似,不过数组初始化时括号中元素的类型都是相同的,结构体则不受限制。

各个成员的初始化方式还是与普通类型初始化方式相同,不过是用大括号括在一起(注意顺序要对应)。

结构体成员的访问

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

例子:

image-20220412095252557

struct Stu
{
	char name[20];
	int age;
};

成员有name和age,那么如何访问它们呢?

使用.操作符

例如:

struct Stu s;
strcpy(s.name, "songxin");
s.age = 20;

直接通过结构体变量名去访问。

结构体的指针可以访问结构体吗?

->操作符

struct Stu* ps = &s;
方法一:
strcpy((*s).name, "songxin");
(*s).age = 20;
方法二:
strcpy(s->name, "songxin");
s->age = 20;

可以理解为结构体指针指向的那个东西的某个成员

ps->某成员

结构体传参

函数传参方式通常有两种:

  1. 传值
  2. 传地址

结构体也不例外。

struct S
{
	int data[1000];
	int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
	printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
	printf("%d\n", ps->num);
}
int main()
{
	print1(s);  //传结构体
	print2(&s); //传地址
	return 0;
}

到底哪种好一些呢?

从两个方面看:

  1. 效率

    • 如果将整个结构体的值传过去,如果结构体过于复杂,那么开销过于巨大

    • 传指针,无论结构体有多么复杂,最终传指针只需要四个字节或者八个字节。

  2. 需要改变结构体值的函数

    • 传值,那么形参只是一份原变量的拷贝,函数体内改变不会影响实际参数。

上面的 print1 和 print2 函数哪个好些?
答案是:首选print2函数。
原因:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值