2021.12.28 关于c语言结构体

目录

结构体的初始化 

结构体成员的访问

结构体传参  


结构体的初始化  

定义:

结构体 (struct)指的是一种数据结构 , 是C语言中 复合数据类型 的一类。 结构体可以被声名为 变量 、指针 或 数组 等, 用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员, 且这些成员可以为不同的类型, 成员一般用名字访问。

简单而言之:c语言中有 int char 等等类型,但是当我们想要描述人这一复杂的类型,便可用到我们的结构体类型(struct),可自己定义该类型,可用来描述人的相关属性。

举例:

#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS

struct MyStruct1
{
	char c;
	short d;
	double e;
};

struct MyStruct2
{
	// 成员变量
	struct MyStruct1  ss1;
	char name[20]; // 名字
	int age; // 年龄
	char id[20]; // 学号
}s1,s2;  // s1,s2为结构体全局变量

int main()
{    
	//  s3为结构体局部变量   
	struct MyStruct2 s3 = { {'w', 20, 3.14}, "张三", 30, "20211227"};// 对象
	           //  初始化         ss1          name  age      id
	return 0;

结构体成员的访问

我们需利用到操作符 . 和 -> 

想详细了解有关操作符相关知识可点击该链接 ​​​​​​https://blog.csdn.net/weixin_63888301/article/details/121892181?spm=1001.2014.3001.5501

举例:

#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS

struct MyStruct1
{
	char c;
	short d;
	double e;
};

struct MyStruct2
{
	// 成员变量
	struct MyStruct1  ss1;
	char name[20]; // 名字
	int age; // 年龄
	char id[20]; // 学号
}s1,s2;  // s1,s2为结构体全局变量

int main()
{    
	//  s3为结构体局部变量   
	struct MyStruct2 s3 = { {'w', 20, 3.14}, "张三", 30, "20211227"};// 对象
	                    //  初始化         ss1          name age        id
	//  结构体成员的访问
	printf("%c\n", s3.ss1.c);
	printf("%s\n", s3.id);

	struct MyStruct2* pd = &s3;
	printf("%c\n", (*pd).ss1.c);
	printf("%c\n", pd->ss1.c);
	return 0;
}

结果为: 

结构体传参  

 我们可用两种传参形式:传值调用和传址调用 

 想详细了解传值调用和传址调用的区别可点击该链接https://blog.csdn.net/weixin_63888301/article/details/121353547?spm=1001.2014.3001.5501

举例:

#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS

struct MyStruct1
{
	char c;
	short d;
	double e;
};

struct MyStruct2
{
	// 成员变量
	struct MyStruct1  ss1;
	char name[20]; // 名字
	int age; // 年龄
	char id[20]; // 学号
}s1,s2;  // s1,s2为结构体全局变量

void print1(struct MyStruct2 t ) // 传值调用
{
	printf("%c %d %lf %s %d %s\n", t.ss1.c, t.ss1.d, t.ss1.e, t.name, t.age, t.id);
}

void print2(struct MyStruct2 * pp) // 传址调用
{
	printf("%c %d %lf %s %d %s\n", pp->ss1.c, pp->ss1.d, pp->ss1.e, pp->name, pp->age, pp->id);
}

int main()
{
	struct MyStruct2 s3 = { {'w', 20, 3.14}, "张三", 30, "20211227" };
	print1(s3);
	return 0;
}

结果:

虽然这两种方式都能实现结构体的传参,但更推荐使用传址调用,理由如下:

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

那什么是压栈呢?

栈区通常 都会开辟空间来储存各数据,而我们的栈是一种数据结构,遵循先进的后出,后进的先出规则。

类似于下图:(先存 1 再存 2 依照循序直到存到 6 ,而出栈则需先出 6 依照循序 直到出 1)

 而我当我们传结构体的地址时,仅传了其地址的4个字节,从而更好的提高了速度。


初阶结构体的内容就是这么多了,博主后期还会更进阶的内容哦!

谢谢浏览,博主写文章不易,可以留下您的点赞,或收藏激励博主!

若文章有错误,请各大佬多多指出,我会及时更正! 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

茂大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值