結構體的巢狀 自身巢狀 相互巢狀
什麼是結構體的巢狀?
在結構體的定義中,結構體的成員又是另外一個結構體的變數。
結構體巢狀的問題有哪些?
結構體的自引用,就是在結構體內部,包含指向自身型別結構體的指標。
結構體的相互引用,就是說在多個結構體中,都包含指向其他結構體的指標。
結構體應該注意的問題?
結構體定義中可以巢狀其他結構體型別的變數,不可以巢狀自己這個型別的變數。
可以巢狀自己型別的指標。
*********************************自引用結構體******************************
****************************************************************************
不用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;