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

这篇具有很好参考价值的文章主要介绍了椋鸟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个长整型的空间文章来源地址https://www.toymoban.com/news/detail-782938.html

#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:结构体(联合体)嵌套、柔性数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • C语言学习(三十一)---结构体、联合体的在内存中的存储

    C语言学习(三十一)---结构体、联合体的在内存中的存储

    在上一篇文章中,我们学习了 枚举 、 位段 和 联合体 的相关内容,在文章的末尾,我们还差了关于 联合体的存储 问题的内容,今天我们将学习该部分的内容,好了,话不多说,开整!!! 结构体 在内存中是如何存储的呢,是按里面的变量内容,在 内存中的连续地址中存

    2024年02月12日
    浏览(5)
  • 一篇博客学会系列(2)—— C语言中的自定义类型 :结构体、位段、枚举、联合体

    一篇博客学会系列(2)—— C语言中的自定义类型 :结构体、位段、枚举、联合体

    目录  前言 1、结构体 1.1、结构体类型的声明 1.2、特殊的结构体类型声明 1.3、结构体的自引用 1.4、结构体的定义和初始化 1.5、结构体成员变量的调用 1.6、结构体内存对齐  1.6.1、offsetof 1.6.2、结构体大小的计算 1.6.3、为什么存在内存对齐?  1.7、 修改默认对齐数 1.8、结构

    2024年02月08日
    浏览(8)
  • 【C语言】一篇文章深入解析联合体和枚举且和结构体的区别

    【C语言】一篇文章深入解析联合体和枚举且和结构体的区别

    联合体( union )是允许一个变量通过不同的接口访问内存的一种数据类型,表示一个变量可以存储不同类型的值,而枚举是使用 enum 定义一组相关且互斥的整形常量集合。本章阿森将和你学习联合体类型的声明,特点,有关大小的计算,还有枚举类型的声明,优点和使

    2024年02月03日
    浏览(6)
  • 联合体(C语言)

    联合体(C语言)

    小伙伴们又来学习知识啦~,今天我要给大家介绍一下联合体的使用,话不多说,我们开始今天的正题吧! 联合体的介绍 C语言的联合体(union)是一种特殊的数据类型,它可以在同一内存空间中存储不同的数据类型。与结构体类似,联合体也可以定义多个成员,但是这些成员

    2024年02月04日
    浏览(10)
  • 自定义类型:结构体、枚举、联合体

    自定义类型:结构体、枚举、联合体

    结构体是一种自定义的数据类型,它由多个不同类型的成员变量组成,结构体可以将多个相关的数据打包在一起,方便进行管理和处理。 定义形式: struct 结构体名{ 类型 成员名1; 类型 成员名2; //更多的成员变量 }; 如描述一个学生: struct Stu这样就和int类型一样,都是数

    2024年02月16日
    浏览(6)
  • c语言-联合体和枚举

    c语言-联合体和枚举

    (1) 像结构体⼀样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。 (2)但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。所以联合体也叫:共用体。 (3) 给联合体其中⼀个成员赋值,其他成员的值也跟着

    2024年02月04日
    浏览(5)
  • c语言-枚举和联合体

    c语言-枚举和联合体

    本篇文章介绍c语言中的枚举类型和联合体类型 枚举类型和结构体类型相似,都是一种自定义类型。 定义枚举类型的: enum 枚举类型的定义格式 例如,定义一个星期作为枚举类型 枚举类型的第一个成员的取值默认为0,依次往后递增1, 输出枚举WEEK每个成员的值 修改枚

    2024年01月21日
    浏览(13)
  • 【C语言】联合体和枚举

    【C语言】联合体和枚举

    前言 这篇博客就把剩下的两个自定义类型联合体和枚举好好总结一下,让我们好好看看联合体和枚举到底是什么 个人主页:小张同学zkf 若有问题 评论区见 感兴趣就关注一下吧 目录  1. 联合体 1.1 联合体类型的声明  1.2 联合体的特点  1.3 相同成员的结构体和联合体对比  

    2024年04月14日
    浏览(5)
  • C语言枚举与联合体详解

    C语言枚举与联合体详解

        本篇文章带来 枚举与联合体 相关知识详细讲解! 如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!!! 目录 一.枚举 1.什么是枚举? 2.枚举类型的定义 3.枚举的优点 4.枚举的使用 二.联合体(共

    2024年02月15日
    浏览(4)
  • 【C语言】位段,枚举和联合体详解

    【C语言】位段,枚举和联合体详解

      目录 1.位段 1.1 什么是位段 1.2 位段的内存分配 1.3 位段的跨平台问题 2.枚举 2.1 枚举类型的定义 2.2 枚举的优点 3. 联合(共用体) 3.1 联合类型的定义 3.2 联合的特点 3.3 联合大小的计算 位段的声明和结构体是类似的,有两个不同: 1.位段的成员必须是 int、unsigned int 或 sig

    2024年02月11日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包