【23】C语言 | 初阶结构体

news/2024/11/16 7:49:56/

目录

1、结构的基础知识

2、结构成员的类型

3、结构体初始化

4、结构体的访问

5、结构体传参


1、结构的基础知识

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

数组:一组相同类型的元素的集合

结构体:也是一些值的集合,但是值的类型可以不同

注意以下几点;

(1)关键字struct是数据类型说明符,指出下面说的是结构体类型;

(2)标识符Student是结构体的类型名;

(3)最后的分号一定要写;

 

2、结构成员的类型

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

注意:对结构体变量整体赋值有三种情况

(1)定义结构体变量(用{}初始化)

(2)用已定义的结构体变量初始化

(3)结构体类型相同的变量可以作为整体相互赋值;

 

 

struct Stu
{//结构体成员char name[20];int age;char id[20];
}s1,s2;     //s1和s2也是结构体变量,他们是全局变量int main()
{struct Stu s;   //在这里struct Stu是对象s的类型return 0;
}

3、结构体初始化

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也是结构体变量,他们是全局变量int main()
{struct Stu s = {{'c',20,3.14},"张三",21,20230105};   //在这里struct Stu是对象s的类型return 0;
}

4、结构体的访问

struct b
{char c;short s;double d;
};
struct Stu
{struct b sb;char name[20];int age;char id[30];
}s1,s2;     int main()
{struct Stu s = {{'c',20,3.14},"张三",21, "20230105" };printf("%c\n",s.sb.c);printf("%c\n",s.id);struct Stu* ps = &s;//printf("%c\n", (*ps).sb.c);//printf("%c\n", ps -> sb.c);return 0;
}

5、结构体传参

//用两种方法:“ . ” 和“ -> ”
struct b
{char c;short s;double d;
};
struct Stu
{struct b sb;char name[20];int age;char id[30];
}s1,s2;     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* pt)
{printf("%c %d %lf %s %d %s\n",pt->sb.c,pt->sb.s,pt->sb.d,pt->name,pt->age,pt->id);
}
int main()
{struct Stu s = {{'c',20,3.14},"张三",21,"20230105" };print1(s);   //传值调用:实参传值到形参的时候,要额外开辟空间,浪费空间和时间print2(&s);  //传址调用:光传过去的是4字节/8字节的地址,没有额外开销,所以这种方法效率更高一些return 0;
}

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

答案是:首选print2函数。

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

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


http://www.ppmy.cn/news/19694.html

相关文章

统计学习方法 学习笔记(5)决策树

决策树5.1.决策树模型与学习5.2.特征选择5.3.决策树的生成5.4.决策树的剪枝5.5.CART算法决策树基本概述: 算法类别:一种基本的分类和回归方法;基本结构:呈现树形结构,在分类问题中表示基于特征对实例进行分类的过程。…

从源码解析代理模式

大纲代理模式(结构型设计模式)通过代理类去访问实现类中的方法,使用场景比如:已有接口和实现类的情况下,想要在已实现的方法基础上扩展更多的功能的场景。代理模式里的主要类:接口实现类,需实现…

c++函数(2)

这里写自定义目录标题默认参数函数重载递归函数变量周期默认参数 可为形参指定默认值,如果在函数调用时,没有指定与形参对应的实参时,就自动使用默认值。 默认参数可简化复杂函数的调用。 默认参数在函数名第一次出现在程序中指定&#xff0…

kubernetes资源对象应用类(二)

kubernetes资源对象应用类(二) Service 的 ClusterIP 地址 既然每个 Pod 都会被分配一个单独的 IP 地址,而且每个 Pod 都提供了一个独立的 Endpoint(Pod IP containerPort)以被客户端访问,那么现在多个 P…

蓝桥杯刷题014——求阶乘(二分法)

求阶乘 蓝桥杯2022省赛题目 问题描述 满足 N ! 的末尾恰好有 K 个 0 的最小的 N 是多少? 如果这样的 N 不存在输出 −1 。 输入格式 一个整数 K 。 输出格式 一个整数代表答案。 样例输入 2样例输出 10评测用例规模与约定 对于 30% 的数据, 1≤K≤10^6. 对于 100% 的数据, 1…

水面漂浮物垃圾识别检测系统 YOlOv7

水面漂浮物垃圾识别检测系统通过PythonYOLOv7网络模型,实现对水面漂浮物以及生活各种垃圾等全天候24小时不间断智能化检测。Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行,主要是因为它的简单性和代码可读性。它使…

【每日一道智力题】之坤坤猜生日(面试高频)

🚀write in front🚀 📜所属专栏:每日一题 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最…

ArrayList类

ArrayList类 目录ArrayList类一、构造方法摘要1.1 ArrayList()1.2 ArrayList(Collection c)1.3 ArrayList(int initialCapacity)二、 ArrayList的扩容机制:2.1 源码如下:2.2. 以上扩容机制的弊端:三、代码案例ArrayList类一、构造方法摘要 1…