C语言_结构体初阶(还未写完)

结构体的声明

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

数组:一组相同类型元素的集合
结构体:一组不一定相同类型元素的集

2. 结构的声明

struct tag //tag根据实际情况给名字
{
    member_list; //成员列表(一个或多个)
}variable_list; //变量列表

//例子:描述一个学生
struct Stu
{
    //成员变量用来描述结构体对象的相关属性    
    char name[20]; //名字
    int age; //年龄
    char sex[5]; //性别
}s2, s3; //这里可以创建结构体变量 - 全局变量

//typedef用法
typedef struct Stu
{
    char name[20]; 
    int age; 
    char sex[5]; 
}Stu; //将struct Stu 重命名为 Stu

int main()
{
    struct Stu s1; //局部变量
    Stu s4;
}

3. 结构成员的类型

//结构的成员可以是标量、数组、指针,甚至是其他结构体。 
struct S
{
    int a;
    char arr[5];
    int* p;
};

struct A
{
    struct S s;
    double d;
};

4. 结构体变量初始化

struct S
{
    int a;
    char arr[5];
    int* p;
}s1 = {100, "abc", NULL}; //第一种初始化

struct S s2 = {12, "fhs", NULL}; //第二种初始化

struct S s3 = {.arr="asd", .p=NULL, .a=1}; //第三种自己找到成员然后初始化
printf("%d %s %p\n", s3.a, s3.arr, s3.p); //. 结构成员访问操作符

//结构体嵌套初始化
struct A
{
    char ch[10];
    struct S s;
    double d;
};

struct A a = {"qqq", {10, "www", NULL}, 3.14};
printf("%s %d %s %p %lf\n", a.ch, a.s.a, a.s.arr, a.s.p, a.d);

结构体成员的访问

//1. 结构体变量访问成员
printf("%d %s %p\n", s3.a, s3.arr, s3.p); //. 结构成员访问操作符
printf("%s %d %s %p %lf\n", a.ch, a.s.a, a.s.arr, a.s.p, a.d);

//2. 结构体指针访问指向变量的成员
struct Stu
{
    char name[20];
    int 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;
}

结构体传参

下面的 print1 和 print2 函数哪个好些?答案是:首选print2函数。

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;
}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/774625.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【基于R语言群体遗传学】-6-表型计算等位基因频率、最大似然估计方法

到目前为止,我们主要讨论了等位基因和基因型频率,以及我们如何可以从一个推断出另一个。但是,如果我们不知道等位基因频率,只知道种群中存在哪些表型呢?如果我们足够幸运,知道哪些表型对应哪些基因型&#…

网络-calico问题分析

项目场景: calico-node日志提示 Failed to auto-detect host MTU - no interfaces matched the MTU interface pattern. To use auto-MTU, set mtuifacePattern to match your hosts’s interfaes. 同时,cali开头网卡的mtu是1440大小 原因分析&#xff…

扁鹊三兄弟的启示,探寻系统稳定的秘诀

一、稳定性的重要性 1. 公司收益的角度 从公司收益的视角审视,系统不稳定可能会引发直接损失。例如,当系统突然出现故障导致交易中断时,可能造成交易款项的紊乱、资金的滞留或损失,这不但会阻碍当前交易的顺利完成,还…

web安全的会议室管理系统-计算机毕业设计源码50331

目 录 摘要 1 绪论 1.1 开发背景与意义 1.2国内外研究现状 1.3 相关技术、工具简介 1.3.1 MySQL数据库的介绍 1.3.2 B/S架构的介绍 1.3.3 Java语言 1.3.4 SpringBoot框架 1.4论文结构与章节安排 2 会议室管理系统需求分析 2.1 可行性分析 2.1.1 技术可行性分析 2…

【Redis】真行,原来是这样啊! --Redis自动序列化和手动序列化的区别(存储结构、内存开销,实际写法)

对于Redis有两种序列化和反序列化的方式, 方式一: 一种是通过 注入RedisTemplate 对象,找个对象,通过配置类进行一定的配置,使得使用RedisTemplate 对象时,便会使用配置的那些键、值的序列化方式&#xff…

深度学习Week19——学习残差网络和ResNet50V2算法

文章目录 深度学习Week18——学习残差网络和ResNet50V2算法 一、前言 二、我的环境 三、论文解读 3.1 预激活设计 3.2 残差单元结构 四、模型复现 4.1 Residual Block 4.2 堆叠Residual Block 4.3. ResNet50V2架构复现 一、前言 🍨 本文为🔗365天深度学…

昇腾910B部署Qwen2-7B-Instruct进行流式输出【pytorch框架】NPU推理

目录 前情提要torch_npu框架mindsport框架mindnlp框架 下载模型国外国内 环境设置代码适配(非流式)MainBranch结果展示 代码适配(流式) 前情提要 torch_npu框架 官方未适配 mindsport框架 官方未适配 mindnlp框架 官方适配…

add_metrology_object_generic 添加测量模型对象。找两条直线,并计算两条线的夹角和两个线的总长度,转换成毫米单位

*添加测量模型对象 *将测量对象添加到测量模型中 *算子参数: *    MeasureHandle:输入测量模型的句柄; *    Shape:输入要测量对象的类型;默认值:‘circle’,参考值:‘circl…

淘宝扭蛋机小程序:打造新的扭蛋体验

扭蛋机行业近年来发展非常迅速,呈现出了明显的增长势头,深受年轻消费者的青睐。当下在消费市场中,年轻人占据了很大的份额,这也推动了扭蛋机市场的发展。如今,扭蛋机也正在向多个方向发展,不再局限于线下扭…

如何利用代理IP打造热门文章

作为内容创作者,我们都知道,有时候地理限制和访问障碍可能会成为我们获取新鲜素材和优质信息的障碍。使用代理IP,正是突破这些限制的好方法! 1. 无缝获取全球视野 如果你还在苦恼看不到其他地区的热点文章,你可以尝试…

保障信息资产:ISO 27001信息安全管理体系的重要性

在当今数字化和全球化的时代,信息安全已经成为企业成功和持续发展的关键因素之一。随着信息技术的快速发展和互联网的普及,企业面临着越来越多的信息安全威胁和挑战,如数据泄露、网络攻击、恶意软件等。为了有效应对这些威胁,企业…

docker集群部署主从mysql

搭建一个mysql集群,1主2从,使用docker容器 一、创建docker的mysql镜像 下次补上,因为现在很多网络不能直接pull,操作下次补上。 二、创建mysql容器 创建容器1 docker run -it -d --name mysql_1 -p 7001:3306 --net mynet --…

Astro新前端框架首次体验

Astro新前端框架首次体验 1、什么是Astro Astro是一个静态网站生成器的前端框架,它提供了一种新的开发方式和更好的性能体验,帮助开发者更快速地构建现代化的网站和应用程序。 简单来说就是:Astro这个是一个网站生成器,可以直接…

生成式人工智能如何改变软件开发:助手还是取代者?

生成式人工智能如何改变软件开发:助手还是取代者? 生成式人工智能(AIGC)正在引领软件开发领域的技术变革。从代码生成、错误检测到自动化测试,AI工具在提高开发效率的同时,也引发了对开发者职业前景的讨论…

标贝语音识别在智能会议系统的应用案例

语音识别是指将语音信号转换成文本或者其他数字信号形式的过程,随着人工智能在人们日常工作生活中的普及,语音识别技术也被广泛的应用在智能家居、智能会议、智能客服、智能驾驶等领域,以语音识别技术在智能会议系统中的应用为例,…

【读点论文】基于二维伽马函数的光照不均匀图像自适应校正算法

基于二维伽马函数的光照不均匀图像自适应校正算法 摘 要:提出了一种基于二维伽马函数的光照不均匀图像自适应校正算法.利用多尺度高斯函数提取出场景的光照分量,然后构造了一种二维伽马函数,并利用光照分量的分布特性调整二维伽马函数的参数,降低光照过强区域图像的亮度值,提高…

服务器U盘安装Centos 7时提示Warning:/dev/root does not exist

这是没有找到正确的镜像路径导致的,我们可以在命令行输入ls /dev看一下有哪些盘符 像图中红色圈起来的就是我插入U盘的盘符,大家的输几盘可能做了多个逻辑盘,这种情况下就可以先将U盘拔掉再ls /dev看一下和刚才相比少了那两个盘符&#xff0c…

Redis高级篇之最佳实践

Redis高级篇之最佳实践 今日内容 Redis键值设计批处理优化服务端优化集群最佳实践 1、Redis键值设计 1.1、优雅的key结构 Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id]长度不超过…

空调计费系统是什么,你知道吗

空调计费系统是一种通过对使用空调的时间和能源消耗进行监测和计量来进行费用计算的系统。它广泛应用于各种场所,如家庭、办公室、商场等,为用户提供了方便、准确的能源使用管理和费用控制。 可实现功能 智能计费:中央空调分户计费系统通过智…

光电液位传感器在宠物洗澡机的应用

光电液位传感器在宠物洗澡机中的应用,为洗澡机的智能化管理提供了重要支持和保障。这种先进的传感技术不仅提升了设备的操作便捷性,还大幅度提高了洗澡过程的安全性和效率。 宠物洗澡机作为宠物护理的重要设备,其水位的控制至关重要。光电液…