结构体入门(超详解)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、结构体类型的声明

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

结构的声明
struct tag
{
member-list;
}variable-list; (可有可无)

代码演示

struct Stu
{
	//成员变量
	char name[20];
	int age;
	char tele[12];
	char sex[5];
}s1,s2;
struct Stu s3;//全局变量
//s1,s2是全局变量
int main()
{
	struct Stu s;//学生
	//局部变量
	struct Stu s1;
	struct Stu s2;
	return 0;
}

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

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

有了结构体类型,那如何定义变量,其实很简单

struct B
{
	char c;
	int i;
};
struct S
{
	char c;
	int num;
	int arr[10];
	double* pd;
	struct B sb;
	struct B* pb;
};
int main()
{
	double d = 3.14;
	//按照顺序初始化
	struct S s1 = { 'q', 100, { 1, 2, 3 }, &d, { 'a', 99 }, NULL };
	//指定成员来初始化
	struct S s2 = { .num = 1000, .arr = { 1, 2, 3, 4, 5 } };
	return 0;
}

三、结构体成员访问

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

结构体指针访问指向变量的成员
有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针,用(->)访问

代码演示

struct Stu
{
	char name[20];
	int age;
}; 
void print(struct Stu* 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);//结构体地址传参
	return 0;
}

运行结果
在这里插入图片描述

四、结构体传参

代码演示

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 ptint2(struct S* ps)//传递的是指针的大小
{
	printf("%d\n", ps->num);
}
int main()
{
	print1(s);//传结构体
	print2(&s);//传地址
	return 0;
}

面对print1和print2函数,首选print2函数

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

结论
结构体传参的时候,要传结构体的地址,同时可以提高效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值