结构体详解+剖析

----------------------结构体详解+剖析--------------------------------

结构体类型的声明

1.结构体的声明

1.1结构体的基础知识

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

1.2结构体的声明

>` struct sth(随便写,最好有意义)
> {
>	   member(成员)--list(列表)
> }variable-list;(创建一个结构体变量)
`

例如描述一个学生:

struct Stu
{
	char name[10];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}Stu;//分号不能丢掉

1.3结构体成员的类型

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

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

有了结构体的类型,那如何定义变量呢?

struct Point
{
	int x;
	int y;//声明结构成员变量类型
}p1;//同时又定义变量p1;

struct Point p2//定义结构体变量p2

	struct Point p3 = { x,y };	//初始化:定义变量的同时赋初始值。
	

结构体初始化

struct Stu//           结构体类型声明
{
	char name[15];//名字
	int age;//年龄
};
struct Stu s = { "zhangsan",20 };//初始化
struct Point
	{
		int x;
		int y;//声明结构成员变量类型
	}p1;//同时又定义变量p1;
struct Node
{
	int date;
	struct Point p;
	struct Node* next;
}n1={10,{4,5},NULL};             //结构体嵌套初始化
struct Node n2 = { 20,{5,6},NULL };//结构体嵌套初始化。

结构体成员的访问

1.结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的。点操作符接收两个操作数。
例如:在这里插入图片描述
我们可以看到结构体s有成员name和age;
那我们如何访问s的成员呢?

struct Stu//           结构体类型声明
{
	char name[15];//名字
	int age;//年龄
};
struct Stu s = { "zhangsan",20 };//初始化

int main()
{
	struct S s;
	strcpy(s.name, "zhangsan");//使用.访问name成员’
	s.age = 20;//使用.访问age成员
	return 0;
}

2.结构体指针访问指向变量的成员
有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。
那该如何访问成员呢?

struct Stu
{
	char name[10];
	int age;
};
void print(struct Stu* ps)//print函数接收结构体地址,定义为ps
{
	printf("name=%s   age=%d\n", (*ps).name, (*ps).age);//利用解引用操作符来访问指针
	//使用结构体指针访问指向对象的成员
	printf("name=%s   age=%d\n", ps->name, ps->age);//->重点
}
int main()
{ 
	struct Stu s = { "zhangsan",20 };
	print(&s);//结构体地址传参,把结构体s的地址传过去
	return 0;
}
        ->(变量地址)可以直接进行访问地址,.操作符还要解引用操作符才能访问地址

结构体传参

struct Stu
{
	int id[1000];//构建结构体
	int age;
};
struct Stu s = { {220503430},20 };//结构体初始化
//结构体传参
void print1(struct Stu s)
{
	printf("%d\n", s.age);
}
//结构体地址传参
void print2(struct Stu* ps)
{
	printf("%d\n", (*ps).age);
	printf("%d\n", ps->age);
}
int main()
{
	print1(s);//传结构体
	print2(&s);//传结构体地址
	return 0;
}

print1和print2函数都能实现对结构体的访问,哪个更好一些呢?
答案是print2函数

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

所以最后结论:
结构体在传参时,最好传结构体的地址!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tew_gogogo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值