1. 程式人生 > >結構體的巢狀 自身巢狀 相互巢狀

結構體的巢狀 自身巢狀 相互巢狀

什麼是結構體的巢狀?

在結構體的定義中,結構體的成員又是另外一個結構體的變數。

結構體巢狀的問題有哪些?

結構體的自引用,就是在結構體內部,包含指向自身型別結構體的指標。

結構體的相互引用,就是說在多個結構體中,都包含指向其他結構體的指標。

結構體應該注意的問題?

結構體定義中可以巢狀其他結構體型別的變數,不可以巢狀自己這個型別的變數。

可以巢狀自己型別的指標。

*********************************自引用結構體******************************

****************************************************************************

不用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;