【C语言学习】结构体【初阶详解篇11】

本文介绍了C语言中的结构体,包括结构体的声明、基础知识、成员类型及初始化。示例展示了如何定义和访问结构体成员,并通过结构体变量和指针进行操作。此外,文章还讨论了结构体作为函数参数的传值调用和传址调用,指出传址调用在处理大型结构体时更优,避免了参数压栈带来的性能损失。
摘要由CSDN通过智能技术生成

【声明】:本次对结构体的学习先做一个简单的介绍和初识,接下来还会有进一步更深入的学习,尽请期待吧!

结构体

结构体的声明

结构的基础知识

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

结构成员的类型

结构的成员可以是标量、数组、指针,甚至是其他结构体。
想知道如何定义结构体?那就看代码吧!!

1.结构体变量的定义和初始化
struct B
{
 char c;
 short s;
 double d;
};
struct Stu   //struct结构体关键字,Stu结构体类型
{
 //成员变量
 struct B sb;//结构体的成员也可以是其他结构体
 char name[20];
 int age;
 char id[20];//学号
}s1,s2;//s1和s2也是结构体变量
//s1,s2是全局变量
int main()
{
 //struct Stu s;//拿Stu这个结构体类型创建一个s对象
 //s是局部变量
 struct Stu s = { {'w',20,3.14},"张三",21,"20210711" };//结构体变量(对象)初始化
 
 2.结构体成员访问. ->
 printf("%c\n", s.sb.c);
 printf("%s\n", s.id);//用.操作符访问结构体成员
 
 struct Stu* ps = &s;//struct Stu*:结构体指针,通过ps打印s里面的内容
 printf("%c\n", (*ps).sb.c);//对ps进行解引用操作
 printf("%c\n", ps->sb.c);//因为ps是指针所以也可以使用->操作符,但sb不是指针,它是一个结构体变量,不可以使用->,应使用.
 return 0;
}

打印结果:
在这里插入图片描述

结构体传参

结构体传参数的两种写法:1、传值调用;2、传址调用

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)//用结构体变量接收s传过来的值给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)//用结构体指针接收s传过来的地址给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()
{
 struct Stu s = { { 'w', 20, 3.14 }, "张三", 21, "20210711" };//对象
 //写一个函数打印s的内容
 //1、传值调用;
 print1(s);//print1调用
 //2、传址调用;
 print2(&s);//print2调用
 return 0;
}

打印结果:
在这里插入图片描述

讨论:结构体传参数的两种写法哪一个好呢?
答:传址调用好
为什么呢?
答:函数传参的时候,参数是需要压的。 如果传递一个结构体对象(传值)的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。因此,结构体传参的时候,要传结构体的地址。

函数调用的参数压栈解释:如下图
压栈:给栈中存数据
在这里插入图片描述
参数传参的动作也叫压栈操作
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值