当前位置: 首页 > news >正文

初识结构体(新手友好)

今天写排结构体的顺序的函数时,发现对结构体的理解似乎有些遗忘,所以我赶紧冲进CSDN写一篇复习类博客,复习的同时也是进一步加深理解,希望也对你有帮助。

我将讨论一下问题:

①为什么要定义结构体这种变量类型?
②结构体如何声明?(格式)
③怎样用结构体定义变量?(局部、全局)
④怎样实现初始化?
1)按顺序初始化
2)不按顺序初始化
3) 结构体嵌套结构体时的初始化
⑤如何辨析结构体类型的名字用结构体类型定义的变量的名字的区别?
⑥结构体成员访问操作符
1)直接访问操作符
2)间接访问操作符

一.为什么要定义结构体这种变量类型?

常说写代码是用于解决日常生活中的问题,描述问题中的数据有很多类型,比如整型、浮点型或是字符型等等,但一些情况下,单单用一类数据类型似乎不太够,比如想描述一个学生的基本信息,这时就可能包括姓名(字符型数组)、年龄(整型)、身高(浮点型)和学号(字符型数组)等等,这时就可以自定义一种可以同时包含我们想要的各种类型的数据类型——结构体类型。

自定义结构体时,成员变量可以是不同类型的变量,如:标量、数组、指针、甚至是其他结构体

二.结构体的声明

struct student //student 是你自定义的这种结构体的名字 { char name[20]; int age; float height; int ID; //花括号里一行一行组成的排列的叫做成员列表,而每一行都是一个成员变量 };

struct 结构体名字

{

你想包括的变量类型

};//不要忘记写分号

三.怎样用结构体定义变量(局部、全局)

1)局部结构体变量的定义
struct student { char name[20]; int age; float height; char ID; }; int main() { struct s1; //放在main函数里,是局部变量 }
2)全局结构体变量的定义
struct student { char name[20]; int age; float height; char ID; }s2; //①直接在第二个花括号后和分号前放变量名就是全局变量 struct student s3 ; //②在main函数外定义变量是全局变量 int main() { return 0; }

四.怎样实现初始化?

按、不按顺序定义结构体时的成员列表的顺序初始化
struct student { char name[20]; int age; float height; char ID; }; int main() { //初始化 //按顺序初始化 struct s4 = {"张三" , 18 , 188.8f ,"121011122200" }; //不按顺序初始化 struct s5 = {.ID="121011122200", .height=188.8f, .name="张三", .age=18}; return 0; }

不按顺序初始化,按我的初步理解,只能说要用".成员变量=的方式来初始化"。

结构体嵌套结构体时的初始化
struct stu1 { char name[20]; int age; float height; char ID[20]; }; struct stu2 { struct stu1 s1; int* p1; }; //嵌套初始化 struct stu2 s2 ={ {"李四", 20 , 188.8f , "121011220012" } , NULL }; //struct stu1 s1; ————{"李四", 20 , 188.8f , "121011220012" } //int* p1; ———— NULL

比较好理解,初始化结构体变量需要使用{ },那么当结构体的成员变量中出现另外的结构体时,不就是在{ } 中再加一个{ } 吗?

五.如何辨析结构体类型的名字用结构体类型定义的变量的名字的区别?

为了便于理解,我们以int a;来类比一下。

struct stu2 中的stu2是结构体类型的名字,相当于 int a ;中的int,想一下如果没有给整型取名为int,那我们同样也要给整型这种类型取一个自定义的名字,而在结构体中,stu2就是我们给结构体类型取的名字,道理是一样的。并且声明结构体的过程就像是剖析int类型的过程,只不过int可以直接用,而结构体需要自定义。

struct stu1 s1 中的s1 是结构体变量名,相当于 int a ;中的a ,仅仅只是声明结构体计算机不会分配内存,只有定义了结构体变量,才会分配内存。

插点题外话,我曾经看到过一个比方,"类型+变量=某某"的定义方式可以理解成有一个贴有标签的杯子装了水,标签就是杯子的类型,我只说杯子的类型,你是没法使用这个杯子的,但当我给你一个杯子后(变量),你就可以装水了,而装水的过程就是初始化或者赋值过程。

六.结构体成员访问操作符

1)直接访问操作符 .

使用方式:结构体变量.成员名

#include<stdio.h> struct stu1 { char name[20]; int age; float height; char ID[20]; }; struct stu1 s1={"black", 18 , 168.5 , "121025052017" }; int main() { printf("%s", s1.ID ); return 0; }

s1——结构体变量名(注意!是结构体变量名!不是结构体类型名!)

. ——结构体成员直接访问符

ID ——结构体成员变量名

如果遇到结构体嵌套结构体时也不用慌:

#include<stdio.h> struct stu1 { char name[20]; int age; float height; char ID[20]; }; struct stu2 { int* p; struct stu1 s1; }; struct stu2 s2={ NULL ,{"black", 18 , 168.5 , "121025052017" } }; int main() { printf("%s", s2.s1.ID ); return 0; }

像剥洋葱一样,一层层向里深入,从外层的结构体变量s2到内层的结构体变量s1最后再到内层结构体里的成员变量ID,所以是s2.s1.ID。

2)间接访问操作符 ->

使用方式:结构体指针->成员变量名

#include<stdio.h> struct stu1 { char name[20]; int age; float height; char ID[20]; }; int main() { struct stu1 s1={"black", 18 , 168.5 , "121025052017" } ; struct stu1 *p = &s1; printf("%s", p->ID ); return 0; }

由于本人现在学习有限,这篇博客只能算初识结构体,后续随着学习的深入,我会补充更新的内容与理解,感谢观看。

新手小白学习编程的第57天,如有错误,欢迎指出,我会积极改正!

——end——

http://www.jsqmd.com/news/89106/

相关文章:

  • 学习测评|基于springboot学习测评系统(源码+数据库+文档)
  • 免费AI写论文神器来袭!6款工具一键生成初稿,写论文效率提升300%! - 麟书学长
  • leetcode 困难题 745.Prefix and Suffix Search 前缀和后缀搜索
  • EtherCAT 逐帧报文解析:配置SM/FMMU
  • 列车售票|基于springboot 列车售票系统(源码+数据库+文档)
  • 如何使用SendMessageW或PostMessageW发送换行?
  • 拒绝“面条代码”!Flutter 校园项目的“三层架构”实战
  • 2025.12 北京集训 数学专题
  • 力扣1965-丢失信息的雇员
  • 提示词工程技巧-要 “角色化”,而非 “观点化” 学习
  • Anthropic文章-打造高性能智能体 学习笔记
  • 英语_阅读_Happiness_待读
  • 英语_阅读_Arrest Report Sheet_待读
  • AI在测试中的应用:现状与未来
  • 张量并行 (Tensor Parallelism, TP) 深度解析
  • ‌面试技巧:拿下测试岗位的秘诀
  • Linux修改网络配置和IP地址
  • 三步走截取长图
  • JavaWeb企业级开发---JavaScript
  • 网络安全异想天开(不定期更新)
  • 串口通讯的android 封装开箱即用!提供源代码!
  • 测试左移:构建软件质量的早期防线
  • 力扣1264-页面推荐
  • 抖音uid匹配电话
  • Springboot连锁火锅店餐饮管理系统h2dg0(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • [SWPUCTF 2018]SimplePHP
  • Flutter 多端落地实战:Web 与桌面应用的性能优化、SEO 与用户体验全攻略
  • 系统启动和DNS
  • Springboot连锁家政保洁管理系统03zmn(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • Flutter 测试全栈指南:从单元测试到黄金路径验证的工程化实践