结构体的嵌套 自身嵌套 相互嵌套
什么是結構體的嵌套?
在結構體的定義中,結構體的成員又是另外一個結構體的變量。
結構體嵌套的問題有哪些?
結構體的自引用,就是在結構體內部,包含指向自身類型結構體的指針。
結構體的相互引用,就是說在多個結構體中,都包含指向其他結構體的指針。
結構體應該注意的問題?
結構體定義中可以嵌套其他結構體類型的變量,不可以嵌套自己這個類型的變量。
可以嵌套自己類型的指針。
*********************************自引用結構體******************************
****************************************************************************
不用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;總結
以上是生活随笔為你收集整理的结构体的嵌套 自身嵌套 相互嵌套的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构 结构的声明 一个结
- 下一篇: 二叉树 —— 创建二叉树 先序遍历