C · 初阶 | 结构体

简介: - 结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义

在这里插入图片描述
啊我摔倒了..有没有人扶我起来学习....


@TOC


前言

  • 结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义

一、结构体的声明

1.1 结构的基础知识

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

1.2 结构的声明

struct tag
{
 member-list; 
}variable-list;
例如描述一个学生:
typedef struct Stu
{
 char name[20];//名字
 int age;//年龄
 char sex[5];//性别
 char id[20];//学号
}Stu;//分号不能丢

1.3 结构成员的类型

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

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

  • 有了结构体类型,那如何定义变量,其实很简单
struct Point
{
    int x;
    int y;
}p1; //声明类型的同时定义变量p1

struct Point p2; //定义结构体变量p2

struct Point p3 = { x, y };//初始化:定义变量的同时赋初值
struct Stu        //类型声明
{
    char name[15];//名字
    int age;      //年龄
};
struct Stu s = { "zhangsan", 20 };//初始化
struct Node
{
    int data;
    struct Point p;
    struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化
struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

二、结构体成员的访问

  • 结构体变量访问成员
  • 结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数
例如:
struct Stu        //类型声明
{
    char name[15];//名字
    int age;      //年龄
};
struct Stu s = { "zhangsan", 20 };//初始化
  • 我们可以看到 s 有成员 nameage ;那我们如何访问 s 的成员?
struct S s;
strcpy(s.name, "zhangsan");//使用.访问name成员
s.age = 20;//使用.访问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 print2(struct S* ps) {
    printf("%d\n", ps->num);
}
int main()
{
    print1(s);  //传结构体
    print2(&s); //传地址
    return 0;
}
  • 上面的 print1print2 函数哪个好些?
  • 答案是:首选print2函数
  • 原因:

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

在这里插入图片描述

相关文章
|
6月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
1163 0
|
6月前
|
人工智能 自然语言处理 算法
科研论文翻译神器!BabelDOC:开源AI工具让PDF论文秒变双语对照,公式图表全保留
BabelDOC 是一款专为科学论文设计的开源AI翻译工具,采用先进的无损解析技术和智能布局识别算法,能完美保留原文格式并生成双语对照翻译。
2031 67
科研论文翻译神器!BabelDOC:开源AI工具让PDF论文秒变双语对照,公式图表全保留
|
6月前
|
存储 安全 虚拟化
Omnissa ThinApp 2503 - 应用虚拟化软件
Omnissa ThinApp 2503 - 应用虚拟化软件
277 8
Omnissa ThinApp 2503 - 应用虚拟化软件
|
8月前
|
机器学习/深度学习 编解码 计算机视觉
RT-DETR改进策略【注意力机制篇】| CVPR-2023 FSAS 基于频域的自注意力求解器 结合频域计算和卷积操作 降低噪声影响
RT-DETR改进策略【注意力机制篇】| CVPR-2023 FSAS 基于频域的自注意力求解器 结合频域计算和卷积操作 降低噪声影响
321 2
|
存储 监控 调度
云迁移中心CMH:助力企业高效上云实践全解析
随着云计算的发展,企业上云已成为创新发展的关键。然而,企业上云面临诸多挑战,如复杂的应用依赖梳理、成本效益分析等。阿里云推出的云迁移中心(CMH)旨在解决这些问题,提供自动化的系统调研、规划、迁移和割接等功能,简化上云过程。CMH通过评估、准备、迁移和割接四个阶段,帮助企业高效完成数字化转型。未来,CMH将继续提升智能化水平,支持更多行业和复杂环境,助力企业轻松上云。
|
人工智能 搜索推荐
强大的AI搜索引擎——秘塔AI搜索
【2月更文挑战第17天】强大的AI搜索引擎——秘塔AI搜索
4886 2
强大的AI搜索引擎——秘塔AI搜索
|
数据可视化 JavaScript 前端开发
低代码可视化工具--vue条件判断v-if可视化设置-代码生成器
低代码可视化工具--vue条件判断v-if可视化设置-代码生成器
204 2
|
Android开发 开发者
FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件
谷歌推出的Transformer,作为Jetpack Media3架构的一部分,助力开发者实现音视频格式转换与编辑。Media3简化了媒体处理流程,提升了定制性和可靠性。Transformer可用于剪辑、添加滤镜等操作,其示例代码可在指定GitHub仓库中找到。要使用Transformer,需在`build.gradle`中添加相关依赖,并按文档编写处理逻辑,最终完成音视频转换任务。具体步骤包括配置剪辑参数、设置空间效果以及监听转换事件等。
201 0
FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
268 2
|
Unix Linux 开发者
在Linux中,什么是GPL、GNU,自由由软件?
在Linux中,什么是GPL、GNU,自由由软件?