【明解C语言】之结构体初阶详解

目录

一、结构体的声明

⛳1.结构的基础知识

⛳2.结构体的声明

⛳3.结构成员的类型

二、结构体定义和初始化

⛳1.结构体定义

⛳2.结构体初始化 

三、结构体成员的访问

⛳ 1.点操作符(.)

⛳ 2.箭头操作符 (->) 

四、结构体传参

⛳1.写一个函数来打印结构体的内容

⛳2.函数调用的参数压栈

⛳3.压栈传参

五、结语 


一、结构体的声明

⛳1.结构的基础知识

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

⛳2.结构体的声明

struct stu
{
    //成员变量
    char name[20];//名字
    int age;//年龄
    char id[20];//学号
};
int main()
{
    struct stu s;//对象
    
    return 0;
}

struct stu是一种自定义类型

s是一个用struct stu创建的对象

char name[20]; int age; char id[20]; 是结构体的成员

⛳3.结构成员的类型

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

struct stu
{
    //成员变量
    char name[20];//名字
    int age;//年龄
    char id[20];//学号
};s1,s2//s1和s2也是结构体变量
//s1,s2是全局变量
int main()
{
    //s是局部变量
    struct stu s;//对象
    return 0;
}
struct B
{
    char c;
    short s;
    double d;
};
struct stu
{
    //成员变量
    struct B sb;
    char name[20];//名字
    int age;//年龄
    char id[20];//学号
};s1,s2//s1和s2也是结构体变量
//s1,s2是全局变量
int main()
{
    //s是局部变量
    struct stu s;//对象
    return 0;
}

 ⚠️ 

注意:结构体的成员可以是另一个结构体


二、结构体定义和初始化

⛳1.结构体定义

详解: 

 用类型创建了一个对象出来,就相当于盖房子,在设计出图纸后,用图纸盖出房子。图纸就相当于类型,而房子就相当于对象。
当用struct创建一个对象的时候就可以把它看成是盖了一个房子,而这个房子要有客厅、卧室、厨房。那么相当于在创建出来的对象里要有一块空间来存放它的相关属性。

⛳2.结构体初始化 

 在结构体定义的时候给它一个值就叫做初始化

⚠️

注意:结构体的初始化要使用{ }


三、结构体成员的访问

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

⛳ 1.点操作符(.)

⛳ 2.箭头操作符 (->) 

⚠️

注意:箭头操作符是用在结构体指针里面的

如果大家对指针有疑问,可以去看我关于指针的文章,下面是链接卡片。

【明解C语言】之指针初阶详解_马桶上看算法的博客-CSDN博客C语言初阶、初阶指针、编程语言https://blog.csdn.net/m0_63033419/article/details/124002865?spm=1001.2014.3001.5501


四、结构体传参

⛳1.写一个函数来打印结构体的内容

#include<stdio.h>

struct B
{
    char c;
    short s;
    double d;
};
struct stu
{
    //成员变量
    struct B sb;
    char name[20];//名字
    int age;//年龄
    char id[20];//学号
};
void print1(struct stu t)
{
    printf("%c %d %lf %s %d %s\n", t.sb.c, t.sb.s, t.sb.d, t.name, t.age, t.id);
}
void print2(struct stu* ps)
{
    printf("%c %d %lf %s %d %s\n", ps->sb.c, ps->sb.s, ps->sb.d, ps->name, ps->age, ps->id);
}
int main()
{
    //s是局部变量
    struct stu s = { {'w',20,3.14},"张三",30,"202005034" };//对象
    //写一个函数打印s的内容
    print1(s);//传值调用
    print2(&s);//传址调用
    return 0;
}

如果大家对函数有不理解的,可以去看我关于函数的文章,下面是链接卡片

【明解C语言】之函数详解《上篇》_马桶上看算法的博客-CSDN博客C语言进阶、函数、编程语言https://blog.csdn.net/m0_63033419/article/details/123948510

【明解C语言】之函数详解《下篇》_马桶上看算法的博客-CSDN博客C语言初阶、函数、编程语言https://blog.csdn.net/m0_63033419/article/details/123979991

对于当前代码有一个疑问,那就是print1() 和print2() 哪个函数更好?

答案:print2()更好

理由:

函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,

参数压栈的系统开销就会比较大,所以会导致性能的下降。

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

 剖析:

如果采用print1(),采用的是传值调用。s是一个对象,要开辟一块空间。实参传给形参,形参t为了接受实参s,也要开辟一块相同大小的空间。s有多大,t就多大;s有什么数据,t就有什么数据。要把数据传过去,要为传过去的数据要开辟好一块空间,会准备一块额外的临时空间来接受传过去的数据,空间上会有一些浪费。而且把数据传过去也需要一定的时间,时间上也会有一些浪费。

如果采用的是print2(),采用的是传址调用。传过去的是s的地址,指针变量要接受s的地址,如果是32位平台这个指针变量有4个字节,如果是64位平台这个指针变量有8个字节。传参的时候,传过去的是一个地址,是一个编号,是一个4个字节或8个字节的地址。并没有开辟额外太多的空间,而传过去的地址回来之后还是指向s,因为传过去的是s的地址。 

两种的区别:

第二种传址调用的传参效率会更高一些,print2()只是传递了一个指针大小的空间。

第一种传值调用,参数传过去的时候会造成时间和空间上的双重浪费,导致效率低下一 些。而且t是一个临时拷贝,改变t并不能改变s。

  

⛳2.函数调用的参数压栈

栈是一种数据结构,特点是先进的后出,后进的先出。

假设要在内存中存储1,2,3,4,5的这几个数字。

刚开始栈是个空栈,从栈顶上放了五个数字,给栈中存放数据就叫压栈

如果要删除数据要从栈顶开始删,删除数据就叫出栈

⚠️

注意:

只能从栈顶来存放数据,只能从栈顶来删除数据。

所以先进的后出,后进的先出。

⛳3.压栈传参


五、结语 

这次带大家了解了结构体的知识,希望能对大家有所帮助。原创不易,还请三连。

为了这篇文章,小编在电脑前写了一个下午,还请大家多多支持。点点赞,关个注

什么的。我才能更有动力,才能创作出更好的文章。 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

与大师约会

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

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

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

打赏作者

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

抵扣说明:

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

余额充值