詳解C語言中結構體的自引用和相互引用_C 語言

來源:互聯網
上載者:User

結構體的自引用(self reference),就是在結構體內部,包含指向自身類型結構體的指標。
結構體的相互引用(mutual reference),就是說在多個結構體中,都包含指向其他結構體的指標。
1. 自引用 結構體
1.1 不使用typedef時
錯誤的方式:

struct tag_1{   struct tag_1 A;  /* 結構體 */   int value; }; 

        這種聲明是錯誤的,因為這種聲明實際上是一個無限迴圈,成員b是一個結構體,b的內部還會有成員是結構體,依次下去,無線迴圈。在分配記憶體的時候,由於無限嵌套,也無法確定這個結構體的長度,所以這種方式是非法的。
正確的方式: (使用指標):

struct tag_1{   struct tag_1 *A; /* 指標 */   int value; }; 

        由於指標的長度是確定的(在32位機器上指標長度為4),所以編譯器能夠確定該結構體的長度。
1.2 使用typedef 時
錯誤的方式:

typedef struct {   int value;   NODE *link; /* 雖然也使用指標,但這裡的問題是:NODE尚未被定義 */ } NODE; 

這裡的目的是使用typedef為結構體建立一個別名NODEP。但是這裡是錯誤的,因為類型名的範圍是從語句的結尾開始,而在結構體內部是不能使用的,因為還沒定義。
正確的方式:有三種,差別不大,使用哪種都可以。

/* 方法一 */ typedef struct tag_1{   int value;   struct tag_1 *link;  } NODE;   /* 方法二 */ struct tag_2; typedef struct tag_2 NODE; struct tag_2{   int value;   NODE *link;   };   /* 方法三 */ struct tag_3{   int value;   struct tag *link;  }; typedef struct tag_3 NODE; 

2. 相互引用 結構體
錯誤的方式:

typedef struct tag_a{   int value;   B *bp; /* 類型B還沒有被定義 */ } A;  typedef struct tag_b{   int value;   A *ap; } B; 

 
        錯誤的原因和上面一樣,這裡類型B在定義之 前 就被使用。
正確的方式:(使用“不完全聲明”)

/* 方法一  */  struct tag_a{   struct tag_b *bp; /* 這裡struct tag_b 還沒有定義,但編譯器可以接受 */   int value; }; struct tag_b{   struct tag_a *ap;   int value; }; typedef struct tag_a A; typedef struct tag_b B;    /* 方法二  */  struct tag_a;  /* 使用結構體的不完整聲明(incomplete declaration) */ struct tag_b; typedef struct tag_a A;  typedef struct tag_b B; struct tag_a{   struct tag_b *bp; /* 這裡struct tag_b 還沒有定義,但編譯器可以接受 */   int value; }; struct tag_b{   struct tag_a *ap;   int value; }; 

3.執行個體:
應用結構體指標變數,列印結構體成員變數的資訊。

#include <stdio.h>struct Point{double x; /*x座標*/double y; /*y座標*/double z; /*z座標*/};int main(){struct Point oPoint1={100,100,0};struct Point oPoint2;struct Point *pPoint; /*定義結構體指標變數*/pPoint=& oPoint2;   /*結構體指標變數賦值*/(*pPoint).x= oPoint1.x;(*pPoint).y= oPoint1.y;(*pPoint).z= oPoint1.z;printf("oPoint2={%7.2f,%7.2f,%7.2f}",oPoint2.x, oPoint2.y, oPoint2.z);return(0);}

程式運行結果如下:

oPoint2={ 100.00,100.00,0.00}

其中運算式&oPoint2的作用是獲得結構體變數oPoint2的地址。運算式pPoint=&oPoint2的作用是將oPoint2的地址儲存在結構體指標變數pPoint中,因此pPoint儲存了oPoint2的地址。*pPoint代表指標變數pPoint中的內容,因此*pPoint 和oPoint2等價。
通過結構體指標變數獲得其結構體變數的成員變數的一般形式如下:
(*結構體指標變數). 成員變數
其中“結構體指標變數”為結構體指標變數,“成員變數”為結構體成員變數名稱,“.”為取結構體成員變數的運算子。
另外C語言中引入了新的運算子“->”,通過結構體指標變數直接獲得結構體變數的成員變數,一般形式如下:
結構體指標變數-> 成員變數
其中“結構體指標變數”為結構體指標變數,“成員變數”為結構體成員變數名稱,“- >”為運算子。
因此,例中的部分代碼

……(*pPoint).x= oPoint1.x;(*pPoint).y= oPoint1.y;(*pPoint).z= oPoint1.z;……

等價於

……pPoint->x= oPoint1.x;pPoint->y= oPoint1.y;pPoint->z= oPoint1.z;……

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.