椋鸟C语言笔记#31:结构体(联合体)嵌套、柔性数组

2024-01-12 01:52

本文主要是介绍椋鸟C语言笔记#31:结构体(联合体)嵌套、柔性数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

萌新的学习笔记,写错了恳请斧正。


目录

结构体(联合体)嵌套

嵌套时内嵌结构体(联合体)不创建变量(匿名)

嵌套时内嵌结构体(联合体)创建变量(非匿名)

嵌套初始化

柔性数组

柔性数组的使用


结构体(联合体)嵌套

结构体、联合体可以嵌套,也就是说结构体(联合体)的成员也可以是结构体(联合体)

嵌套时内嵌结构体(联合体)不创建变量(匿名)

如果嵌套时内嵌结构体(联合体)不创建变量(匿名),内嵌结构体(联合体)的成员会被认为是外围结构体(联合体)的成员,如果外围结构体(联合体)也是匿名的,那么就递归应用此规则:

#include <stdio.h>struct
{int x;struct{int y;union{int z;char c;};};
} a;int main()
{a.z = 1;printf("%d\n", a.c);return 0; 
}

注意:此匿名非彼匿名,结构体类型依旧可以有名字,但是不能内嵌结构体只能有其声明部分而不能在后面加成员变量名

嵌套时内嵌结构体(联合体)创建变量(非匿名)

当嵌套时内嵌结构体(联合体)创建变量(非匿名),则需要通过访问操作符先访问这个内嵌结构体类型的成员,再访问其中的成员,如果外围结构体(联合体)也是非匿名结构体,那么就递归应用此规则:

#include <stdio.h>struct S1
{struct S2{union U1{union U2{int n1;int n2;} u2;int n3;} u1;int n4;} s2;int n5;
} s1;int main()
{s1.s2.u1.u2.n1 = 1;printf("%d\n", s1.s2.u1.n3);return 0; 
}

同样的,这里的非匿名也与匿名结构体无关,结构体类型也可以没有命名,但是内嵌结构体后面应该加成员变量名

嵌套初始化

这边C官网上讲的足够清楚了,链接在此

柔性数组

在C99标准以后,结构体的最后一个成员被允许是一个未知大小的数组,这就叫柔性数组

这个未知大小当然不是真的未知,而是“可动态分配”

比方说:

struct S
{int i;long arr[];
};

或者写成:

struct S
{int i;long arr[0];
};

特点:

  • 柔性数组成员前必须至少包含一个其他成员
  • 用sizeof返回包含柔性数组的结构体的大小时,忽略柔性数组后正常计算
  • 包含柔性数组的结构体不能作为数组成员或者其他结构体的成员
  • 如果创建包含柔性数组的结构体变量最好使用动态内存分配(见下)
柔性数组的使用

如下便是给柔性数组分配了40个长整型的空间

#include <stdio.h>
#include <stdlib.h>typedef struct
{int i;long arr[];
} stt;int main()
{stt* p = (stt*)malloc(sizeof(stt) + 40 * sizeof(long));if (p == NULL){perror("malloc-p");exit(EXIT_FAILURE);}p->i = 40;for (int i = 0; i < 40; i++)p->arr[i] = i + 1;for (int i = 0; i < 40; i++)printf("%2ld\t", (*p).arr[i]);free(p);p = NULL;return 0;
}

这篇关于椋鸟C语言笔记#31:结构体(联合体)嵌套、柔性数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/596426

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)