什么是結構體的嵌套?
在結構體的定義中,結構體的成員又是另外一個結構體的變量。
結構體嵌套的問題有哪些?
結構體的自引用,就是在結構體內部,包含指向自身類型結構體的指針。
結構體的相互引用,就是說在多個結構體中,都包含指向其他結構體的指針。
結構體應該注意的問題?
結構體定義中可以嵌套其他結構體類型的變量,不可以嵌套自己這個類型的變量。
可以嵌套自己類型的指針。
*********************************自引用結構體******************************
****************************************************************************
不用TYPEDEF——正確的方式:
1 #include<iostream> 2 using namespace std; 3 struct tag_1 4 { 5 struct tsg_1 *A; 6 //由於指針的長度時確定的(在32位機器上指針長度是4),所以編譯器能夠確定該 7 結構體的長度 8 //這個指針看似指向自身,其實不是,而是執行同一類型的不同結構。 9 int value; 10 };
用TYPEDEF——正確的方式(“不完全聲明”):
1 #include<iostream> 2 using namespace std; 3 //正確的方式 使用不 完全聲明 4 typedef struct tag_a A; 5 typedef struct tag_b B; 6 struct tag_a 7 { 8 // struct tag_b *bp; 9 B *bp; 10 int value; 11 }; 12 struct tag_b 13 { 14 // struct tag_a *ap; 15 A *ap; 16 int value; 17 };
********************************結構體嵌套的三種正確形式************************
***********************************************************************************
1 typedef struct tag_1 2 { 3 int value; 4 struct tag_1 *link; 5 }NODE;
1 typedef struct tag_1 NODE; 2 struct tag_1 3 { 4 int value; 5 NODE *link; 6 };
1 struct tag_1 2 { 3 int value; 4 struct tag_1 *link; 5 }; 6 typedef struct tag_1 NODE;
結構體自身嵌套時候要注意:
結構體內部定義了一個指向結構體的指針,指針的大小在具體的機器平台和編譯器環境中都是已知的(不同的平台環境的定義不完全相同)。但是要提醒的是:這個指針看似指向自身,其實不是,而是指向同一類型的不同結構。
鏈表和樹的數據結構就都使用到此技巧。自身的結構體指針指向下一節點或者下一子樹的地址。
1 /* 正確的表示*/ 2 typedef struct s_ref_t //這里是結構體類型定義 和 結構體標簽 3 { 4 int value; 5 struct s_ref_t *link;//注意這句話與上面相同位置的區別,使用了標簽 6 7 }s_ref_2;
