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

自定义类型:结构体(1)

1.结构体回顾

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

1.1结构的声明

struct tag
{
    member-list;
}variable-list;

例如描述一个学生:

struct Stu
{
   char name[20];
   int age;
   char sex[5];
};

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

#include <stdio.h>
struct Stu
{
   char name[20];
   int age;
   char sex[5];
   char id[20];
};
int main()
{
  //按照结构体成员的顺序初始化
    struct Stu s = { "张三", 20, "男", "2024123456" };
printf("name: %s\n", s.name);
printf("age: %d\n", s.age);
printf("sex: %s\n", s.sex);
printf("id: %s\n", s.id);


  //按照指定的顺序初始化
struct Stu s2 = {.age = 18, .name = "lisa", .id = "2024345678", .sex = "女" };
printf("name: %s\n", s2.name);
printf("age: %d\n", s2.age);
printf("sex: %s\n", s2.sex);
printf("id: %s\n", s2.id);

2 .结构的特殊声明

在声明结构的时候,可以不完全声明。

比如:

//匿名结构体类型
struct
{
   int a;
   char b;
   float c;
}x;
//匿名结构体指针类型
struct
{
  int a;
  char b;
  float c;
}a[20], *p;

上面的两个结构体在声明的时候省略掉了结构体标签。

那么,在上面代码的基础上,下面的代码合法吗?

p = &x;

警告:

编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。

匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用一次。

3.结构的自引用

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

比如,定义一个链表的节点:

struct Node
{
    int data;
    struct Node next;
};
上述代码正确吗?如果正确,那 sizeof(struct Node) 是多少?
仔细分析,其实是不行的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的大小就会无穷的大,是不合理的。
正确的自引用方式:
struct Node
{
    int data;//数据域
    struct Node * next;//指针域
};
在结构体自引用使用的过程中,夹杂了 typedef 对匿名结构体类型重命名,也容易引入问题,看看
下面的代码,可行吗?
typedef struct 
{
    int data;
    Node* next;
}Node;
答案是不行的,因为Node是对前面的匿名结构体类型的重命名产⽣的,但是在匿名结构体内部提前使用Node类型来创建成员变量,这是不行的。
解决方案如下:
typedef struct Node
{
    int data;
    struct Node* next;
}Node;

定义结构体尽量不要使用匿名结构体。

相关文章:

  • qq刷赞网站怎么做如何建网站
  • 装修平台合作网站优化排名怎么做
  • 淘宝网站官网专门培训seo的网站
  • 做自媒体那几个网站好点廊坊seo
  • 网站开发费用计入科目衡阳百度推广
  • 网站怎样做关键词优化谷歌浏览器下载安装2023最新版
  • 在 Qt 创建项目时,Qt Quick Application (Compat) 和 Qt Quick Application
  • 5种特效融合愚人节搞怪病毒
  • 深入解析C#中的解释器模式:原理与应用
  • C语言:多线程
  • 《Python实战进阶》第39集:模型部署——TensorFlow Serving 与 ONNX
  • C--操作符
  • AI人工智能-PyCharm的介绍安装应用
  • Vue学习笔记集--defineExpose
  • CSP-J 2019 入门级 第一轮(初赛) 完善程序(2)
  • 协程 Coroutine
  • 综合实验一
  • Arduino示例代码讲解:Virtual Color Mixer 虚拟混色器
  • CS提取的基本使用和模块加载
  • 树莓派超全系列文档--(14)无需交互使用raspi-config工具其一
  • 记录vite-plugin-dts打包时无法生成 .d.ts文件问题
  • Numpy常见bug
  • 定时器的定义
  • linux用户组和用户
  • MyBatis复杂查询——一对一、一对多
  • AF3 FeaturePipeline类解读