s7——结构体

文章详细介绍了C语言中结构体的声明、初始化、成员访问以及结构体作为函数参数的传递方式。强调了结构体变量可以通过`.`来访问成员,结构体指针则通过`->`来访问,并指出在传参时,由于结构体较大,通常选择传址以提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识点:

1、结构体类型的声明

2、结构体初始化

3、结构体成员访问

4、结构体传参


1、结构体类型的声明

1.1 结构的基础知识

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

1.2  结构的声明

例如描写一个学生:

//描述一个学生
struct stu
{
	//结构体成员
	char name[20];//名字
	int age;
	char sex[10];//性别
	float score;
};//注意;不能丢

 1.3  结构成员的类型

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

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

有了结构体类型,怎么定义变量呢?
类比内置类型:int float……
代码实例:
定义变量:通过类型创造变量
//描述一个学生
struct stu
{
	//结构体成员
	char name[20];//名字
	int age;
	char sex[10];//性别
	float score;
} s3;//s3是结构体变量——全局的(声明类型的同时定义变量)

struct stu s4;//s4是结构体变量——全局的

int main()
{
	struct stu s1, s2;//s1,s2也是结构体变量——局部的

	return 0;
}

初始化:定义变量的同时赋初值

//初始化:定义变量的同时赋初值

struct stu
{
	//结构体成员
	char name[20];//名字
	int age;
	char sex[10];//性别
	float score;
};

int main()
{
	struct stu s1 = { "张三", 19, "男" ,65.5f };

	return 0;
}

补充:结构体嵌套初始化

//结构体1
struct S
{
	int a;
	char ch;
};

//结构体2
struct P
{
	double d;
	struct S s;//结构体嵌套
	float f;
};

#include<stdio.h>

int main()
{
	struct P p = { 5.5, {99,'a'},85.1f };//结构体嵌套初始化

	//打印p结构体1中的内容
	printf("%d %c\n", p.s.a, p.s.ch);
	return 0;
}

2、结构体成员的访问

        ①结构体变量访问成员:结构体变量.成员名(.操作符)

        ②结构体指针访问指向变量成员:结构体指针->成员名(->操作符)

代码实例:

//2、结构体成员的访问
// . 结构体变量.成员名
// -> 结构体指针->成员名

//结构体1
struct S
{
	int a;
	char ch;
};

//结构体2
struct P
{
	double d;
	struct S s;//结构体嵌套
	float f;
};

#include<stdio.h>

void print1(struct P sp)
{
	//结构体变量.成员名
	printf("%.2lf %d %c %.2f\n", sp.d, sp.s.a, sp.s.ch, sp.f);
}

void print2(struct P* sp)
{
	printf("%.2lf %d %c %.2f\n", (*sp).d, (*sp).s.a, (*sp).s.ch, (*sp).f);
	//结构体指针->成员名
	printf("%.2lf %d %c %.2f\n", sp->d, sp->s.a, sp->s.ch, sp->f);
}

int main()
{
	struct P p = { 5.5, {99,'a'},85.1f };//结构体嵌套初始化

	print1(p);//传值调用
	print2(&p);//传址调用

	return 0;
}

3、结构体传参

代码实例:

//2、结构体成员的访问
// . 结构体变量.成员名
// -> 结构体指针->成员名

//结构体1
struct S
{
	int a;
	char ch;
};

//结构体2
struct P
{
	double d;
	struct S s;//结构体嵌套
	float f;
};

#include<stdio.h>

void print1(struct P sp)
{
	//结构体变量.成员名
	printf("%.2lf %d %c %.2f\n", sp.d, sp.s.a, sp.s.ch, sp.f);
}

void print2(struct P* sp)
{
	printf("%.2lf %d %c %.2f\n", (*sp).d, (*sp).s.a, (*sp).s.ch, (*sp).f);
	//结构体指针->成员名
	printf("%.2lf %d %c %.2f\n", sp->d, sp->s.a, sp->s.ch, sp->f);
}

int main()
{
	struct P p = { 5.5, {99,'a'},85.1f };//结构体嵌套初始化

	print1(p);//传值调用
	print2(&p);//传址调用

	return 0;
}

上面的print1和print2函数哪个好些呢?

答案是:首选print2函数

原因:

函数传参的时候,参数是需要压栈的。

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

结论:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值