初始结构体

简介: 初始结构体


概念:结构体是一些值的集合,这些值被称为成员变量。结构体内的每个成员可以是不同类型的变量,可以是标量,数组指针,甚至可以是其他结构体。

理解:结构体是一个类型,类似于int,float,double等,但这个类型的名字是可以自定义的。这样讲可能也很难理解,我们可以在下面的讲解中慢慢理解。

结构体的声明:   struct  tag               struct为结构体的关键字,tag是可以自定义的结构体标签,也就是给结构体的类型起个名字(类似于整型的类型名字是int,单精度的类型名字是float)。

下面我们定义一个结构体类型,为了描述一个学生:

 struct stu
 {
  char name[10];
  short age[5];
  char tele[20];
  char sex[2];
 };

阅读上面定义的结构体类型,里面包含了学生的名字,年龄,电话号,性别。像上面这样就成功的定义了一个结构体类型,类型的名字叫stu。一定要注意的是,‘}’后面的‘;’是不可以省略的。这个结构体类型的名字虽然是stu,但是在mian函数中定义变量时不能直接在stu后面加上变量名的。如下面程序:

注:为讲解方便,在下面程序中并没有给结构体变量初始化。

 int main()
 {
  struct stu s;
 }

我们在使用这个类型时,是把结构体标签加上的。如果在main函数中要经常使用这个结构体类型,这样就会显得特别麻烦,于是我们可以这样改进:

 #include<stdio.h>
 typedef struct stu
 {
  char name[10];
  short age[5];
  char tele[20];
  char sex[2];
 }stu;
 int main()
 {
   stu s;
 }

我们在定义结构体类型时,在关键字前面加上了“typedef”,并且在“}”后面加上了变量名,这样子在后面main函数中使用时就可以直接类型名加上变量名。

我们也可以在定义结构体类型时,直接定义结构体类型的变量,操作如下:

 struct stu
 {
  char name[10];
  short age[5];
  char tele[20];
  char sex[2];
 }s1,s2,s3;

在结构体类型的后面直接加上想要定义的变量名,就可以直接定义结构体类型的变量,但需要注意的是这样定义的变量是全局变量,在平常使用时非到万不得已,最好不要这样写。我们还需要注意的是这段代码与上一段代码的区别,一个加了typedf,后面跟的是类型名,不加typedf后面跟的是变量名。

结构体变量的初始化:在定义一个结构体变量后,我们就得给这个变量初始化,初始化的方法入下:

 #include<stdio.h>
 struct stu
 {
  char name[6];
  char sex[4];
  char tele[20];
  short age;
 };
int main()
 {
  struct stu s = { "张三" , "男" ,  "18888888" , 14};
 }

我们可以在使用结构体时,按照结构体,将结构体变量逐一初始化。



这只是一种初始化的方法,还其他方法,直接用代码来演示:

 struct stu
 {
 char name[20];
 char sex[20];
 int age;
 }s={"zhangsan","男“,18};
 或者
 struct stu
 {
    char name[20];
    char sex[20];
    int age;
  };
  struct stu s={"李四”,“男”,18};  
 //这两种方法都是对全局变量的初始化

结构体概念中我们提到,结构体中还可以是指针或其他结构体,我们用一段代码来演示:

 #include<stdio.h>
 struct stu1
 {
  char name[6];
  char sex[4];
  char tele[20];
  short age;
 };
 struct stu2
 {
  struct stu1 s1;//我们在stu2中用stu1定义了一个变量,变量名叫是s1
  char* pc;//定义了一个指针变量pc
 };
 int main()
 {
  char arr[20] = { "点赞收藏加关注" };
  struct stu2 s2 = { { "张三" , "男" ,  "1888888888" , 14},arr};
 //初始化结构体类型变量中的结构体类型需要加上花括号
 }

结构体成员的访问

如果想要打印结构体变量中的某一成员是,我们可以使用(.)操作符,若想要将上一个程序里面s2的成员打印出来,我们可以进行以下操作:

 printf("%s\n", s2.pc);//打印s2中的指针变量所指向的值
printf("%s", s2.s1.tele);//打印s2中的结构体s1中的tele

运行结果如下:

结构体在函数中的传参:

直接上代码:

方法一:

 #include<stdio.h>
 typedef struct stu
 {
  char name[10];
  char sex[4];
  char tele[20];
  int age;
 }stu;
 void Printf(stu x)//接收变量x时,要使用与x类型相同的实参
 {
   printf("%s", x.name);
 }
 int main()
 {
  stu s = { "奥特曼","男","不明",500 };
  Printf(s);//将s传给Printf函数
 }

方法二:

 #include<stdio.h>
 typedef struct stu
 {
  char name[10];
  char sex[4];
  char tele[20];
  int age;
 }stu;
 void Printf(stu* x)//接收变量x时,要使用与x类型相同的实参
 {
   printf("%s", x->name);//->用于指向结构体成员数据的指针,用来取成员数据。
 }
 int main()
 {
  stu s = { "奥特曼","男","不明",500 };
  Printf(&s);//将s的地址传给Printf函数
 }

对比放方法一与方法二,哪一个好呢?

显然是第二个,因为第一个会在Printf函数中开辟一个与s一样大小的空间,如果s成员所占空间很大的话,就会造成空间浪费。第二种方法是传输地址,在Printf中开辟空间与s中成员大小无关,只与成员个数有关,因为地址的大小要么是4要么是8(在32位操作系统中地址大小为4,在64位操作系统中地址大小为8),这样就会节省很多内存空间。


相关文章
|
7月前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁主要依靠一个SETNX指令实现的 , 这条命令的含义就是“SET if Not Exists”,即不存在的时候才会设置值。 只有在key不存在的情况下,将键key的值设置为value。如果key已经存在,则SETNX命令不做任何操作。 这个命令的返回值如下。 ● 命令在设置成功时返回1。 ● 命令在设置失败时返回0。 假设此时有线程A和线程B同时访问临界区代码,假设线程A首先执行了SETNX命令,并返回结果1,继续向下执行。而此时线程B再次执行SETNX命令时,返回的结果为0,则线程B不能继续向下执行。只有当线程A执行DELETE命令将设置的锁状态删除时,线程B才会成功执行S
|
6月前
|
存储 人工智能 监控
通过Milvus和Langchain快速构建基于百炼大模型的LLM问答系统
阿里云向量检索服务Milvus版是一款全托管向量检索引擎,并确保与开源Milvus的完全兼容性,支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus云服务成为多样化AI应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的Attu工具进行可视化操作,进一步促进应用的快速开发和部署。
|
5月前
|
存储 数据可视化 数据处理
optisystem输出到matlab的数据结构
optisystem输出到matlab的数据结构
|
11月前
|
存储 算法 安全
深入理解Linux内核的内存管理机制
本文旨在深入探讨Linux操作系统内核的内存管理机制,包括其设计理念、实现方式以及优化策略。通过详细分析Linux内核如何处理物理内存和虚拟内存,揭示了其在高效利用系统资源方面的卓越性能。文章还讨论了内存管理中的关键概念如分页、交换空间和内存映射等,并解释了这些机制如何协同工作以提供稳定可靠的内存服务。此外,本文也探讨了最新的Linux版本中引入的一些内存管理改进,以及它们对系统性能的影响。
空口资源 | 带你读《5G 空口设计与实践进阶 》之十四
NR对空口物理资源的划分包括 3 个维度,即时域、频域和空域。为了满足各种差异化应用场景的要求,NR 在对“时—频—空”物理资源的管理上,除继承 LTE 的基础外,也进行了大量的革新,包括自适应的波形、更为灵活的帧结构、可配置的参数集、部分带宽等。
空口资源 | 带你读《5G 空口设计与实践进阶 》之十四
|
缓存 关系型数据库 MySQL
MySQL调优之服务器参数优化实践
MySQL调优之服务器参数优化实践
1705 1
|
监控 关系型数据库 Shell
第十二章 Shell脚本编写及常见面试题(一)
第十二章 Shell脚本编写及常见面试题(一)
|
机器学习/深度学习 计算机视觉
【论文速递】ICLR2023 - 基于视觉语言预训练模型的医疗图像小样本学习及零样本推理性能研究
【论文速递】ICLR2023 - 基于视觉语言预训练模型的医疗图像小样本学习及零样本推理性能研究
304 0
|
消息中间件 存储 运维
NBF事件中心架构设计与实现
本文介绍了事件驱动架构在供应链执行链路的应用背景和实践过程,并介绍了NBF事件中心产品的设计和部分实现。目前事件中心每日事件发送量峰值在千万级别,平稳度过了双11、双12、年货节等流量高峰。
1079 2
NBF事件中心架构设计与实现
|
机器学习/深度学习 存储 分布式计算
阿里开源首个DL框架,新型XDL帮你搞定大规模稀疏数据
12 月 21 日,阿里巴巴旗下的大数据营销平台阿里妈妈开源了其应用于自身广告业务的算法框架 X-Deep Learning(XDL)。该框架非常擅长处理高维稀疏数据,对构建推荐、搜索和广告系统非常有优势。此外,阿里还配套发布了一系列官方模型,它们都是阿里在实际业务或产品中采用的高效模型。
1490 0
阿里开源首个DL框架,新型XDL帮你搞定大规模稀疏数据