詳解C說話中構造體的自援用和互相援用。本站提示廣大學習愛好者:(詳解C說話中構造體的自援用和互相援用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C說話中構造體的自援用和互相援用正文
構造體的自援用(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; ……