零基础玩转C语言—结构体【初阶】

大家好,我是深鱼~

目录

【前言】:

一、结构体的声明

1.1结构的基本知识

1.2结构的声明

1.3结构体成员的类型

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

二、结构体成员的访问


【前言】:本章来介绍结构体的部分知识,并不会深入讲解,只是初阶部分,看得懂结构体的逻辑,并且会简单的运用,后期进阶部分还会深入讲解,希望对大家有所帮助

一、结构体的声明

1.1结构的基本知识

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

这就让我们想起来数组:一组相同类型元素的集合

1.2结构的声明

struct tag             //结构体关键字+名字(根据实际情况自己命名)

{

member-list;        //成员变量的列表(一个或多个)

}variable-list        //变量列表

为什么要出现结构体呢?

当前学习过的类型都是内置类型,eg:char,int,short,double...但是如果我们想要用一个类型来创建一个复杂对象,比如人:继续要名字+性别+年龄+电话+地址+...这时C语言就引进了结构体这个类型来创建复杂对象(对于一个变量,我们首先得有一个类型来创建这个变量,然后再把值存入变量中去)

 假如我们要创建学生的变量:

学生类型——>  学生的变量——>   学生的属性信息

代码实现:

#include<stdio.h>
struct Stu
{//学生的相关的属性char name[20];int age;char sex[5];char tele[12];
}s3,s4;           //这里的s3,s4是变量名
struct Stu s5;     //这样创建全局变量也是可以的
int main()
{struct Stu s1;  //注意这里类型是struct Stu(struct是不可以省略的)struct Stu s2;return 0;
}

上面一个创建了s1,s2,s3,s4,s5五个变量,但是s1,s2是局部变量s3,s4,s5是全局变量

如果我们想要简化变量的类型重命名

typedef struct Stu
{//学生的相关的属性char name[20];int age;char sex[5];char tele[12];
}Stu;    //Stu是重命名产生的新的类型
int main()
{Stu s5;return 0;
}

typedef是类型重定义,就是把类型的名字重命名

【注意】上一个代码中s3,s4是变量名,而这个代码中Stu是重命名产生的新类型

1.3结构体成员的类型

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

代码演示:我们可以看到结构体成员还是比较丰富的

struct B
{char c;int i;
};
struct S
{char c;int num;int arr[10];double* pd;struct B sb;struct B* pb;
};
int main()
{return 0;
}

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

定义:

全局变量的创建有两种:

(1)直接在结构体声明分号之前的加上变量名;

(2)在结构体声明结束后,跟局部变量创建一样些,但是不写在main函数中

初始化:

(1)按照顺序初始化:跟数组一样用{ },中间根据成员顺序输入进行初始化

(2)指定成员初始化:这样就得加上成员的名称eg:.num=1000,其他没有初始化的部分默认为0

代码演示如下:

struct B
{char c;int i;
};
struct S
{char c;int num;int arr[10];double* pd;struct B sb;struct B* pb;
}s1;  //s1是全局变量(第一种)struct S s2;//s2是全局变量(第二种)int main()
{double d = 3.14;//按照顺序初始化struct S s3 = { 'q',100,{1,2,3},&d,{'a',1},NULL };//局部变量//指定成员来初始化struct S s4={.num=1000,.arr={1,2,3,4,5}};return 0;
}

二、结构体成员的访问

·结构体变量.成员名

·结构体指针->成员名

 代码演示:【写一个函数给s存放数据】

#include<string.h>
struct S
{char name[20];int age;
};
void set_s(struct S* ps) 
{(*ps).age = 18;strcpy((*ps).name, "zhangsan");//字符串拷贝//(*ps).name = "zhangsan";这是错误的,因为name是数组名,数组名是地址常量
}
int main()
{struct S s = { 0 };//写一个函数给s种存放数据set_s(&s);return 0;
}

这里要注意两个点:

(1)在name(数组成员)中存放数据的时候,我们不能像age一样直接存放

因为name是数组名,数组名是地址常量,就相当于我们是把张三放到了一个门牌号上,并没有放入房间里,所以我们就用strcpy函数来存放数据

(2)在传参的时候不能直接传个过去,而要把s的地址(&s)传进去:

实参传给形参的时候,实参只是实参的一份临时拷贝,对形参的修改不会影响实参

上面是用结构体变量.成员名这个方法来存放数据的

其实也可以这样:指针直接指向成员名更好理解一点

ps->age=18;
strcpy(ps->name,"zhangsan");

下面再来【写一个函数打印s中的数据】:这里传参直接传结构体变量s就可以,只是打印不用带回main函数,其实这里传地址也可以,这其实也是更好的选择

struct S
{char name[20];int age;
};
void print_s(struct S t)
{printf("%s %d\n", t.name, t.age);
}
void set_s(struct S* ps)
{ps->age = 18;strcpy(ps->name, "zhangsan");//字符串拷贝
}
int main()
{struct S s = { 0 };/*写一个函数给s种存放数据*/set_s(&s);//写一个函数打印s中的数据print_s(s);return 0;
}

【总结】:结构体传参的时候,要传结构体的地址

(1)当传参时传的是变量时,我们能做的事就很少,因为形参只是实参是一份临时拷贝,对形参进行操作并不改变实参;但是直接传地址过去,我们能干的就很多

(2)当我们传变量的时候,拷贝一份实参也是需要空间的

而直接传地址,直接对原参数进行操作,不需要多余的空间,大大提高了效率

 这次结构体的内容就到此啦,有什么问题欢迎评论区或者私信交流,觉得笔者写的还可以,或者自己有些许收获的,麻烦铁汁们动动小手,给俺来个一键三连,万分感谢 !

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NOSQL之Redis配置及优化

目录 一、关系型数据库 二、非关系型数据库 三、关系型数据库和非关系型数据库区别 1、数据存储方式不同 2、扩展方式不同 3、对事务性的支持不同 四、Redis简介 五、Redis优点 &#xff08;1&#xff09;具有极高的数据读写速度 &#xff08;2&#xff09;支持丰富的…

基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

C 语言 - 存储类说明符

【预备知识】 1&#xff09;C 语言 - 存储时期 2&#xff09;C 语言 - 链接属性 3&#xff09;C 语言 - 作用域 1. 分类&#xff1a; C 语言为变量提供了 5 中不同的存储模型&#xff08;即存储类&#xff09;。 &#xff08;此外还有基于指针的第 6 种存储模型&#xff0c…

html实现蜂窝菜单

效果图 CSS样式 keyframes _fade-in_mkmxd_1 {0% {filter: blur(20px);opacity: 0}to {filter: none;opacity: 1} } keyframes _drop-in_mkmxd_1 {0% {transform: var(--transform) translateY(-100px) translateZ(400px)}to {transform: var(--transform)} } ._examples_mkmx…

uniapp小程序,根据小程序的环境版本,控制的显页面功能按钮的示隐藏

需求&#xff1a;根据小程序环境控制控制页面某个功能按钮的显示隐藏&#xff1b; 下面是官方文档和功能实现的相关代码&#xff1a; 实现上面需要&#xff0c;用到了uni.getAccountInfoSync()&#xff1a; uni.getAccountInfoSync() 是一个 Uniapp 提供的同步方法&#xff0c…

rsync远程同步

文章目录 一.rsync简介1.一款快速增量备份工具2.rsync应用场景2.1 rsyncinotify的应用场景2.2 rsynccron的应用场景 二.配置rsync备份源&#xff08;同步方式&#xff09;1.rsync同步源2.同步方式3.备份的方式 三.常用rsync命令1.基本格式2.常用选项3.配置源的两种表达 四.配置…

Android 面试题 内存泄露的原因 二

&#x1f525; 什么是内存泄漏 &#x1f525; 在Android开发过程中&#xff0c;当一个对象已经不需要再使用了&#xff0c;本该被回收时&#xff0c;而另个正在使用的对象持有它引用从而导致它不能被回收&#xff0c;这就导致本该被回收的对象不能被回收而停留在堆内存中&#…

SQL-每日一题【626.换座位】

题目 表: Seat 编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数&#xff0c;则最后一个学生的id不交换。 按 id 升序 返回结果表。 查询结果格式如下所示。 示例 1: 解题思路 前置知识 MySQL 的 MOD() 函数是取模运算的函数&#xff0c;它返回两个数相除…

【自用记录】常见的第三方接口加密签名方式(ASCll码字典序、URL键值对、 SHA-256加密、MD5加密)

案例1: 案例2: 以上第三方接口都用类似的加密签名方式,两者有类似的部分: 方案1的: $kdata = array(parkId=>$parkId,ts => $ts,serviceCode=>getParkingPaymentList,reqId => $reqId,plateNo => $car_code,//车牌 可为空pageIndex => 1,//第几页page…

无涯教程-jQuery - innerHeight( )方法函数

innerHeight()方法获取第一个匹配元素的内部高度(不包括边框&#xff0c;包括填充)。 innerHeight( ) - 语法 selector.innerHeight( ) innerHeight( ) - 示例 以下是一个简单的示例&#xff0c;简单说明了此方法的用法- <html><head><title>The jQuery…

适合做笔记的软件有哪些?8款好用强大的笔记软件推荐!

除了Goodnotes和Notability&#xff0c;你还知道哪些值得推荐的免费笔记软件吗&#xff1f;本文结合自己的使用经验&#xff0c;推荐笔记软件的同时&#xff0c;亦推荐一些不错的绘图软件供大家选择使用。 1.OneNote 基本的笔记功能都有&#xff0c;加粗、倾斜、下划线、突…

TPlink云路由器界面端口映射设置方法?快解析内网穿透能实现吗?

有很多网友在问&#xff1a;TPlink路由器端口映射怎么设置&#xff1f;因为不懂端口映射的原理&#xff0c;所以无从下手&#xff0c;下面小编就给大家分享TPlink云路由器界面端口映射设置方法&#xff0c;帮助大家快速入门TP路由器端口映射设置方法。 1.登录路由器管理界面&a…

高等数学中如何求间断点

高等数学中求间断点是一项重要的技巧&#xff0c;特别适用于分析函数的性质和图像的特征。在本文中&#xff0c;我们将深入探讨如何在给定函数中找到间断点&#xff0c;并解释其数学原理和实际应用。 什么是间断点&#xff1f; 在高等数学中&#xff0c;间断点是指函数在某个点…

【C++从0到王者】第十四站:list基本使用及其介绍

文章目录 一、list基本介绍二、list基本使用1.尾插头插接口使用2.insert接口使用3.查找某个值所在的位置4.erase接口使用以及迭代器失效5.reverse6.sort7.merge8.unique9.remove11.splice 三、list基本使用完整代码 一、list基本介绍 如下所示&#xff0c;是库里面对list的基本…

pytorch学习——正则化技术——权重衰减

一、概念介绍 权重衰减&#xff08;Weight Decay&#xff09;是一种常用的正则化技术&#xff0c;它通过在损失函数中添加一个惩罚项来限制模型的复杂度&#xff0c;从而防止过拟合。 在训练参数化机器学习模型时&#xff0c; 权重衰减&#xff08;weight decay&#xff09;是…

消防应急照明设置要求在炼钢车间电气室的应用

摘 要:文章以GB51309—2018《消防应急照明和疏散指示系统技术标准》为设计依据&#xff0c;结合某炼钢车间转炉项目的设计过程&#xff0c;在炼钢车间电气室的疏散照明和备用照明的设计思路、原则和方法等方面进行阐述。通过选择合理的消防应急疏散照明控制系统及灯具供配电方案…

国内办公协作系统评测:5 款软件推荐

办公协作系统是现代信息化办公的必备工具之一&#xff0c;对于企业来说&#xff0c;选择一款好用的办公协作系统非常重要。然而&#xff0c;在众多的办公协作系统中&#xff0c;哪个好用是一个让人头痛的问题。总体而言&#xff0c;国内的办公协作系统已经相当成熟和完善&#…

golang interface类型的nil

golang中interface变量&#xff0c;底层两个对象来存&#xff0c;一个是type、一个是value&#xff0c;只有type、value都为nil时&#xff0c;interface变量才是nil package mainimport ("fmt""reflect" )type People interface {Show() }type Student str…

ALLEGRO之Logic

本文主要讲述ALLEGRO的Logic菜单。 &#xff08;1&#xff09;Net Logic&#xff1a;暂不清楚&#xff1b; &#xff08;2&#xff09;Net Schedule&#xff1a;暂不清楚&#xff1b; &#xff08;3&#xff09;AssignDifferential Pair&#xff1a;暂不清楚&#xff1b; &a…

layui框架学习(35:数据表格_列参数设置)

Layui中的table数据表格模块支持对表格及列进行基础参数设置以提高数据的可视化及可操作性&#xff0c;本文学习并记录与列相关的主要基础参数的用法及效果。   基础参数field设置待显示到列中的数据的字段名&#xff0c;主要针对数据表格url属性中返回的数据集合或data属性设…