Struct嵌套使用
嵌套结构体
结构体也是一种递归定义:结构体的成员具有某种数据类型,而结构体本身也是一种数据类型。换句话说,结构体的成员可以是另一个结构体,即结构体可以嵌套定义。以下的例子中,每个结构体、联合,都可以换成结构体联合、或者类。
一、结构体的声明与定义变量的方法
1.常规方法
struct AA
{
int a;
int b;
}
此时定义变量可以 AAaa; 调用成员 aa.a; aa.b;
2.也可以先在结构体尾部定义一个或者几个变量。
struct CC
{
int a;
int b;
}x1,x2;
此时x1,x2就是已经定义好的CC类型的变量了,这种情况在声明时struct前就一定不能加typedef,如果加上了,x1,x2就成了和CC一样的结构体类型了,而不是变量了。
3.无名结构体,指的是此结构体在声明时没有写名字的情况。
这时如果结构体不是子结构体,那么就必须定义一个变量,用第二种方法。否则此结构体无意义了。
如果此结构体是子结构体,那么此结构体可以定义变量,也可以不定义。如果不定义变量,那么它的成员就会被当成父结构体的直接成员,直接调用。如果定义变量,那么就要通过两级调用才能调用这个结构图的成员。
4. 用typedef的情况。这种情况,定义变量必须在结构体声明之后定义。
使用typedef可以在结构体外部顺便定义此结构体的别名、指针类型、二级指针类型、数组类型等。
typedef struct _ABC
{
int a;
int b;
}ABC,*pABC,ABC_ARRY[20];
注意和第二种情况的区别,一个是实例,一个是类型。
二、结构体嵌套使用方法
1.可以先把子结构体在父结构体之外声明,然后就在父结构体内部把子结构体当成一个普通类型来使用就可以了,不过此时子结构体必须有名字(order就是名字)。这样的好处就是可以在父结构体内部定义多个子结构体类型的成员变量。这时调用子结构体的变量就得通过两级调用了。即aa.order.first;
struct ORDER
{
BYTE first;
BYTE second;
BYTE third;
BYTE forth;
}bb;
union OpcondOrder
{
DWORD data;
ORDER order;
}aa;
2.把子结构体在父结构体内部定义的情况:
a. 如果内部定义的子结构体没有名字,那么定义完父结构体后,就把子结构体的成员当成父结构体的第一级成员(直接成员)来调用就行了。此时子结构体不能定义变量。
union OPCODEORDER
{
DWORD data;
struct //没有名字不能定义变量
{
BYTE forth;
BYTE third;
BYTE second;
BYTE first;
}; //没有变量
}aa;
这时就可这样调用:aa.first;aa.second;直接当成自己的一级成员来用。 //这时这个结构体没有意义
如果此时作为子结构体的 无名结构体定义了变量,那么就需要二级调用才能够调用无名结构体的成员。
union OPCODEORDER
{
DWORD data;
Struct
{
BYTE forth;
BYTE third;
BYTE second;
BYTE first;
}cc;
}aa;
这时调用就需要:aa.cc.first;aa.cc.second;当成父结构体的二级成员调用。
b. 对于内部定义的结构体有名字的情况,如果此有名子结构体没有定义变量,那么在调用的时候就要通过二级调用,而且第二级调用要用类作用域区分符(::),否则会报错。
union OPCODEORDER
{
DWORD data;
struct ORDER
{ //有名字,就要类作用域区分符,'::'
BYTE forth;
BYTE third;
BYTE second;
BYTE first;
};
}aa;
此时就得这样调用 aa.ORDER::first;aa.ORDER::second;aa.ORDER::third;
如果有名字的结构体定义了变量,那么调用时也是通过两种二级调用,此时就是普通的二级调用了和用类作用域区分符(::),就兼容了第一种情况的调用方法和上面的这种方法。
union OPCODEORDER
{
DWORD data;
struct ORDER
{
BYTE forth;
BYTE third;
BYTE second;
BYTE first;
}cc;
}aa;
第一种调用方法aa.cc.first;aa.cc.second;
第二种调用方法 aa.ORDER::first;aa.ORDER::second;
Struct嵌套使用相关推荐
- 结构struct嵌套
结构还可以嵌套结构,但不能嵌套自身(嵌套自身的指针除外) #include <stdio.h> /* 时间:2022-05-11 19:08 作者:sgbl888 功能:结构嵌套 知识点: ...
- 4. struct 结构体
struct和array的区别是,array里的数据类型都是一样的,struct可以用不一样的类型. 下面是array和struct区别的例子. // Normal arrays -> a co ...
- 经典Golang语法50问!
前言 Golang 这门语言想必大家都不陌生,现在也比较火,学习的人也比较多.作为一款性能还算不错的语言,现在很多大厂的新项目都选择了Golang. 这期针对大家的疑惑,总结了大厂系列Golang语法 ...
- clone是深拷贝还是浅拷贝_go-clone:深拷贝 Go 数据结构
继续闲来写写码,这次来介绍一下半年多以前写的一个库,最近工作中发现真的有用,还是值得推荐一下的. 背景 这个库是 github.com/huandu/go-clone,主要用途是对任意的 Go 结构进 ...
- 微信搜一搜在线检索技术演进复盘
作者:kaelhua,腾讯 WXG 后台开发工程师 背景 2020 年下半年我们(搜一搜工程团队)开发了一个新的内存检索引擎 ZeroSearch,并开始对搜一搜背后的大量垂直搜索系统进行升级,随着升 ...
- enum in c language
今天说说C语言中的枚举. 参考:Enumeration (or enum) in C 1 定义 定义一个枚举类型很容易: enum aa { a1, a2, a3 }; 这里 enum是关键字 aa是 ...
- disp语句怎么格式 matlab_Matlab使用技巧总结-1
抽空看了Matlab官方文档,并配合郭老师的课程,把Matlab语言系统梳理了一遍.先上资源: bilibili良心搬运大法: MATLAB_台大郭彦甫-视频教程 知乎盐选推荐基础教程: MATLAB ...
- Golang笔记—封装/继承/接口
基本介绍 Golang 仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它 OOP 语言不一 样,下面我们一一为同学们进行详细的讲解 Golang 的三大特性是如何实现的. 封装介绍 封 ...
- matlab中ncread读取nc文件其中一个三维参数的其中一维_Matlab使用技巧总结-1
抽空看了Matlab官方文档,并配合郭老师的课程,把Matlab语言系统梳理了一遍.先上资源: bilibili良心搬运大法: MATLAB_台大郭彦甫-视频教程 知乎盐选推荐基础教程: MATLAB ...
最新文章
- python中什么是字符举例说明_第20p,什么是字符串?Python中的str
- PAT(甲级)2018年冬季考试 7-3 Vertex Coloring
- rust拆自己家门_非常“掉价”的四大汽车装潢,豪车装上也难看,车主:回去拆了...
- SNMP系统信息获取工具onesixtyone
- 001-测试用例简介
- android 控件遮盖,Android手机软键盘遮挡布局控件
- NYOJ 195 飞翔
- return和break的区别
- 方立勋_30天掌握JavaWeb_(JSP+JavaBean实现)简单计算器
- ASP中FSO的神奇功能(1)
- 量子链创始人:监管者应看到区块链科技的大局
- 财经职业技能测试的软件,2020技能 2.财经管理类 职业技能测试考试大纲(试行)...
- matlab dll 通达信,通达信DLL插件实战篇,怎样制作我们想要的函数
- chrome浏览器版本和driver版本对照表
- phpstudy的基本使用方法
- OMNeT++学习---TicToc(1)
- eclipse复制行快捷键与屏幕旋转冲突的解决
- 关于XDR的这些问题你都了解吗?
- linux初学习题五显示系统时间现实格式为:小时/分钟/秒AM/PM!
- APP推广的十大法宝