自定义类型结构体(上)

简介: 自定义类型结构体(上)

结构体类型的声明

结构体的概念

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

举个例子:杰克的英语只考了60分,你需要将杰克考试的信息填在一张表中,那么表中的信息应该有姓名 班级 学号 分数,表就是杰克信息的集合,而姓名班级等等则都是表中成员,姓名具体对应的名称为杰克,则就称为成员变量

从上面的例子不难看出,结构体中的成员可以是不同类型的变量,我们再回想一下数组,数组的每个成员是不是都是同一种类型的变量,由于结构体和数组都是一些值的集合,因此我推断出数组是结构体的特殊情况(虽然表现的形式有区别)

结构体的声明

struct tag(tag为你自己设定的名称)
{
  member-list;//成员列表
}variable-list;//变量列表(可有可无)

我们依然用上面的例子:

//描述杰克的英语成绩
struct Stu
{
  char name[20];//名字
  int class[20];//班级
  char id[20];//学号
  char Score[20];//分数
};

如果我们需要对杰克 约翰 等人填写信息的话,我们需要创建多个变量

方式一:

struct Stu
{
  char name[20];//名字
  int class[20];//班级
  char id[20];//学号
  char Score[20];//分数
}s1,s2,s3;//是三个结构体变量(是全局变量)

方式二:

struct Stu
{
  char name[20];//名字
  int class[20];//班级
  char id[20];//学号
  char Score[20];//分数
}
int main()
{
struct stu s4,s5,s6//局部变量
return 0;
}

特殊的声明

在声明结构的时候,可以不完全的声明比如:

//匿名结构体类型
struct
{
  int a;
  char b;
  float c;
}x;//只能用一次
struct
{
  int a;
  char b;
  float c;
}a[20], * p;//只能用一次

我们来看一段代码:

struct
{
  char name[20]
}a;
struct
{
  char name[20]
}*p;
int main()
{
  p = &a;
  return 0;
}

虽然两个结构体里面的变量是一样的,但是在运行时VS仍然会把他认为是两种不同的结构体,既是你将b结构体的地址传给p,也不能让p变成b的结构体

结构的自引用

在结构中包含⼀个类型为该结构本身的成员是否可以呢?

比如:

struct Node
{
  int data;
  struct Node next;
};

仔细分析,其实是不行的,因为一个结构体中再包含一个同类型的结构体变量,这样结构体变量的大小就会无穷的大,是不合理的

在学到这里时我其实想到了一个数学例子

虽然这个结果是可以求极限的,但是这个嵌套的方式和这道题非常类似

正确的自引用方式:

struct Node
{
  int data;
  struct Node* next;
};
如果我们用的是同类型结构体指针struct Node* next,我们就可以算出内存大小了,因为*next是具体指向一个地址,有且只有一个,所以内存不会无限大

在结构体自引用使用的过程中,夹杂了typedef对匿名结构体类型重命名,也容易引入问题,看看下面的代码

typedef struct
{
  int data;
  Node* next;
}Node;

结果是不行的,因为Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,导致结构体还没有完全创建出来就拿出来用,这很明显是不行的.

解决方案如下:定义结构体不要使用匿名结构体了

typedef struct Node
{
  int data;
  struct Node* next;
}Node;

这里要和上面的例子要区别开,因为在一开始我们就让结构体类型为Node,所以在中间我们可以直接拿来用

结构体变量的创建和初始化

有了结构体类型,那如何定义变量,其实很简单,结构体变量的初始化使用{}

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中的struct Point p的话
printf("%d %d",Node.p.x,Node.p.y)
struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

指示器初始化方式(C99),这种方式允许不是按照成员顺序初始化

struct Stu
{
  char name[15];
  int age;
};
struct Stu s = {.age=20, .name="zhangsan"};//初始化

.age就可以准确的将20赋值给age,这样就可以不按照成员顺序初始化了

结构成员访问操作符

结构成员访问操作符有两个一个是 . ,一个是 -> .

形式如下:

结构体变量.成员变量名
结构体指针—>成员变量名

我们看一个例子:

#include <stdio.h>
#include <string.h>
struct Stu
{
  char name[15];//名字
  int age; //年龄
};
void print_stu(struct Stu s)
{
  printf("%s %d\n", s.name, s.age);
}
void set_stu(struct Stu* ps)
{
  strcpy(ps->name, "李四");
  ps->age = 28;
}
int main()
{
  struct Stu s = { "张三", 20 };
  print_stu(s);
  set_stu(&s);
  print_stu(s);
  return 0;
}

相关文章
|
Java 数据库连接 mybatis
mybatis返回map类型数据空值字段不显示(三种解决方法)
mybatis返回map类型数据空值字段不显示(三种解决方法)
|
安全 前端开发 BI
基于Debian10.10的开源蜜罐T-Pot 20.06.2安装
基于Debian10.10的开源蜜罐T-Pot 20.06.2安装
881 0
基于Debian10.10的开源蜜罐T-Pot 20.06.2安装
|
2月前
|
分布式计算 运维 API
Databricks 实测 Spark 比 Flink 快 92%,流计算要变天了。
Databricks 3月2日发布测评:Spark Real-Time Mode(RTM)在实时特征计算(编码、enrichment、聚合)中,较Flink最高快92%(p99延迟9ms vs 95ms)。RTM打破微批限制,实现毫秒级低延迟、全状态支持与流式Shuffle,挑战“必须双引擎”行业共识。
262 2
|
3月前
|
人工智能 缓存 自然语言处理
阿里云百炼模型订阅怎么选?Token Plan、Coding Plan与Night Plan节省计划对比指南
阿里云百炼作为一站式大模型服务平台,提供了丰富的订阅计划与模型服务,覆盖个人开发、团队协作、企业级应用等全场景。从面向个人开发者的Coding Plan,到团队协同的Token Plan,再到夜间特惠的Night Plan与成本优化的AI通用节省计划,不同计划在计费模式、模型支持、使用限制上差异显著。本文将系统拆解百炼四大核心订阅计划,详解Qwen系列模型能力差异,提供完整API接入代码与配置流程,并给出不同场景下的选型与省钱策略,帮助开发者与企业高效、低成本使用大模型服务。
535 1
|
3月前
|
人工智能 安全 Cloud Native
云上大模型安全围栏设计:链路、能力与 POC 指标
云上大模型应用的安全围栏,通常需要覆盖输入检测、输出复检、策略处置、日志审计、样本回流和合规治理。评估这类方案时,不建议只看厂商介绍或功能清单,更应关注它与模型服务、业务系统、日志平台、权限体系和安全运营流程的集成方式。本文以工程落地为主线,梳理大模型安全围栏的常见架构、方案类型和 POC 指标。
|
11月前
|
存储 人工智能 运维
AI重构知识管理:如何破解技术团队的6大效率困局
通过AI全链路赋能,实现技术文档智能生成、语义检索、隐性知识沉淀与企业级安全管控,破解研发中API文档低效、故障排查慢、知识复用难等痛点,提升文档效率300%、故障修复提速80%,助力团队从“被动管理”迈向“智能协同”,重构高效能研发新范式。
476 12
|
5月前
|
人工智能 自然语言处理 数据库
智能分诊+AI问诊+电子处方,互联网医院系统源码功能开发技术架构揭秘
本文从软件开发与系统架构视角,深入解析互联网医院系统源码的核心设计逻辑,重点拆解智能分诊、AI问诊与电子处方三大核心模块,并结合微服务架构、高并发设计、医疗数据安全与AI大模型接入等关键技术。
|
4月前
|
人工智能 Java C++
微服务网关怎么选:Spring Cloud Gateway vs Higress
微服务网关是系统统一入口,聚焦鉴权、限流、路由等横切关注点。本文对比Spring Cloud Gateway(Java生态、易上手、业务逻辑灵活)与Higress(C++/Envoy内核、高性能、云原生+AI原生、控制台驱动),从性能、运维、扩展性等9维度给出选型指南,助团队按场景精准决策
422 0
|
人工智能 运维 数据可视化
AR巡检轨道交通、地铁运维场景的应用技术方案|阿法龙XR云平台
基于AR眼镜与云端协同架构,融合YOLOv8算法与高精度数字孪生,实现地铁车辆智能巡检。支持可视化标记、自动缺陷识别、离线巡检同步及多维数据分析,覆盖计划制定、执行记录到报表输出全流程闭环管理,提升巡检效率与准确性。
|
人工智能 运维 数据可视化
申报开启丨2025年10月批次阿里云协同育人项目申报指南,支持所有学科
阿里云联合教育部启动2025年产学合作协同育人项目,面向本科高校征集教学改革、实践基地建设与师资培训项目,聚焦AI+X课程、AIGC设计、智能编码、大数据分析等方向,提供资金、技术与资源支持,深化产教融合,共育创新人才。申报截止11月30日。