什么是结构体的嵌套?
在结构体的定义中,结构体的成员又是另外一个结构体的变量。
结构体嵌套的问题有哪些?
结构体的自引用,就是在结构体内部,包含指向自身类型结构体的指针。
结构体的相互引用,就是说在多个结构体中,都包含指向其他结构体的指针。
结构体应该注意的问题?
结构体定义中可以嵌套其他结构体类型的变量,不可以嵌套自己这个类型的变量。
可以嵌套自己类型的指针。
*********************************自引用结构体******************************
****************************************************************************
不用TYPEDEF——错误的方式:
#include<iostream>
using namespace std;
struct tag_1{
struct tag_1 A; //A是一个结构体,A的内部还会有一个结构体,以此下>去,无线循环。在内存分配的时候,由于无限的嵌套,无法确定结构体的长度,所>以时非法的。
int value;
};
int main()
{
return 0;
}
不用TYPEDEF——正确的方式:
#include<iostream>
using namespace std;
struct tag_1
{
struct tsg_1 *A;
//由于指针的长度时确定的(在32位机器上指针长度是4),所以编译器能够确定该
结构体的长度
//这个指针看似指向自身,其实不是,而是执行同一类型的不同结构。
int value;
};
用TYPEDEF——错误的方式:
#include<iostream>
using namespace std;
typedef struct{
int value;
NODE *link;
}NODE;
//使用typedef为结构体创建一个别名NODE。
//但是是错误的,因为类型名的作用域是从语句结尾开始的,而在结构体内部是不>能使用的,因为还没有定义。
*********************************相互引用结构体******************************
*******************************************************************************
用TYPEDEF——错误的方式:
#include<iostream>
using namespace std;
typedef struct tag_a
{
B *bp;
int value;
}A;
typedef struct tag_b
{
A *ap;
int value;
}B;
//错误的,在类型B在定义之前就被引用
用TYPEDEF——正确的方式(“不完全声明”):
#include<iostream>
using namespace std;
//正确的方式 使用不 完全声明
typedef struct tag_a A;
typedef struct tag_b B;
struct tag_a
{
// struct tag_b *bp;
B *bp;
int value;
};
struct tag_b
{
// struct tag_a *ap;
A *ap;
int value;
};
********************************结构体嵌套的三种正确形式************************
***********************************************************************************
typedef struct tag_1
{
int value;
struct tag_1 *link;
}NODE;
typedef struct tag_1 NODE;
struct tag_1
{
int value;
NODE *link;
};
struct tag_1
{
int value;
struct tag_1 *link;
};
typedef struct tag_1 NODE;
结构体自身嵌套时候要注意:
结构体内部定义了一个指向结构体的指针,指针的大小在具体的机器平台和编译器环境中都是已知的(即使不同的平台环境的定义不完全相同)。但是要提醒的是:这个指针看似指向自身,其实不是,而是指向同一类型的不同结构。
链表和树的数据结构就都使用到此技巧。自身的结构体指针指向下一节点或者下一子树的地址。
/* 错误的表示*/
typedef struct //这里是结构体类型的定义
{
int value;
s_ref_1 *link;//注意这局引用了结构体类型名
}s_ref_1;//ISO C++ 不允许声明无类型的‘s_ref_1’
/* 正确的表示*/
typedef struct s_ref_t //这里是结构体类型定义 和 结构体标签
{
int value;
struct s_ref_t *link;//注意这句话与上面相同位置的区别,使用了标签
}s_ref_2;