欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C語言中結(jié)構(gòu)體的自引用和相互引用

 更新時(shí)間:2016年04月20日 10:39:57   作者:daheiantian  
這篇文章主要介紹了C語言中結(jié)構(gòu)體的自引用和相互引用,詳細(xì)解析了結(jié)構(gòu)體中指針的指向情況,需要的朋友可以參考下

結(jié)構(gòu)體的自引用(self reference),就是在結(jié)構(gòu)體內(nèi)部,包含指向自身類型結(jié)構(gòu)體的指針。
結(jié)構(gòu)體的相互引用(mutual reference),就是說在多個(gè)結(jié)構(gòu)體中,都包含指向其他結(jié)構(gòu)體的指針。
1. 自引用 結(jié)構(gòu)體
1.1 不使用typedef時(shí)
錯(cuò)誤的方式:

struct tag_1{ 
  struct tag_1 A;  /* 結(jié)構(gòu)體 */ 
  int value; 
}; 

        這種聲明是錯(cuò)誤的,因?yàn)檫@種聲明實(shí)際上是一個(gè)無限循環(huán),成員b是一個(gè)結(jié)構(gòu)體,b的內(nèi)部還會(huì)有成員是結(jié)構(gòu)體,依次下去,無線循環(huán)。在分配內(nèi)存的時(shí)候,由于無限嵌套,也無法確定這個(gè)結(jié)構(gòu)體的長度,所以這種方式是非法的。
正確的方式: (使用指針):

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

        由于指針的長度是確定的(在32位機(jī)器上指針長度為4),所以編譯器能夠確定該結(jié)構(gòu)體的長度。
1.2 使用typedef 時(shí)
錯(cuò)誤的方式:

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

這里的目的是使用typedef為結(jié)構(gòu)體創(chuàng)建一個(gè)別名NODEP。但是這里是錯(cuò)誤的,因?yàn)轭愋兔淖饔糜蚴菑恼Z句的結(jié)尾開始,而在結(jié)構(gòu)體內(nèi)部是不能使用的,因?yàn)檫€沒定義。
正確的方式:有三種,差別不大,使用哪種都可以。

/* 方法一 */ 
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. 相互引用 結(jié)構(gòu)體
錯(cuò)誤的方式:

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

 
        錯(cuò)誤的原因和上面一樣,這里類型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;  /* 使用結(jié)構(gòu)體的不完整聲明(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.實(shí)例:
應(yīng)用結(jié)構(gòu)體指針變量,打印結(jié)構(gòu)體成員變量的信息。

#include <stdio.h>
struct Point
{
double x; /*x坐標(biāo)*/
double y; /*y坐標(biāo)*/
double z; /*z坐標(biāo)*/
};
int main()
{
struct Point oPoint1={100,100,0};
struct Point oPoint2;
struct Point *pPoint; /*定義結(jié)構(gòu)體指針變量*/
pPoint=& oPoint2;   /*結(jié)構(gòu)體指針變量賦值*/
(*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);
}

程序運(yùn)行結(jié)果如下:

oPoint2={ 100.00,100.00,0.00}

其中表達(dá)式&oPoint2的作用是獲得結(jié)構(gòu)體變量oPoint2的地址。表達(dá)式pPoint=&oPoint2的作用是將oPoint2的地址存儲(chǔ)在結(jié)構(gòu)體指針變量pPoint中,因此pPoint存儲(chǔ)了oPoint2的地址。*pPoint代表指針變量pPoint中的內(nèi)容,因此*pPoint 和oPoint2等價(jià)。
通過結(jié)構(gòu)體指針變量獲得其結(jié)構(gòu)體變量的成員變量的一般形式如下:
(*結(jié)構(gòu)體指針變量). 成員變量
其中“結(jié)構(gòu)體指針變量”為結(jié)構(gòu)體指針變量,“成員變量”為結(jié)構(gòu)體成員變量名稱,“.”為取結(jié)構(gòu)體成員變量的運(yùn)算符。
另外C語言中引入了新的運(yùn)算符“->”,通過結(jié)構(gòu)體指針變量直接獲得結(jié)構(gòu)體變量的成員變量,一般形式如下:
結(jié)構(gòu)體指針變量-> 成員變量
其中“結(jié)構(gòu)體指針變量”為結(jié)構(gòu)體指針變量,“成員變量”為結(jié)構(gòu)體成員變量名稱,“- >”為運(yùn)算符。
因此,例中的部分代碼

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

等價(jià)于

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

相關(guān)文章

  • C語言 常量詳解及示例代碼

    C語言 常量詳解及示例代碼

    本文主要講解C語言 常量,這里整理了 C語言常量的基礎(chǔ)知識(shí),并附代碼示例和示例詳細(xì)講解,希望能幫助開始學(xué)習(xí)C 語言的同學(xué)
    2016-08-08
  • 利用C語言實(shí)現(xiàn)猜數(shù)字游戲

    利用C語言實(shí)現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家詳細(xì)介紹了利用C語言實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • C++ 仿函數(shù)使用講解

    C++ 仿函數(shù)使用講解

    這篇文章主要介紹了C++ 仿函數(shù)使用講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Qt開發(fā)之獲取電腦磁盤容量

    Qt開發(fā)之獲取電腦磁盤容量

    項(xiàng)目中用到了監(jiān)測某磁盤(如:C盤、D盤等)的總?cè)萘亢涂捎萌萘?,查了一下,發(fā)現(xiàn)其實(shí)挺簡單,本文就來用QT實(shí)現(xiàn)這一功能吧,希望對大家有所幫助
    2023-04-04
  • C語言深入探究棧的原理

    C語言深入探究棧的原理

    一種特殊的線性表,其只允許在固定的一端進(jìn)行插入和刪除元素操作。進(jìn)行數(shù)據(jù)插入和刪除操作的一端 稱為棧頂,另一端稱為棧底。棧中的數(shù)據(jù)元素遵守后進(jìn)先出LIFO(Last In First Out)的原則
    2021-11-11
  • opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合

    opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合

    這篇文章主要為大家詳細(xì)介紹了opencv2基于SURF特征提取實(shí)現(xiàn)兩張圖像拼接融合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例

    C語言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例

    字符串不僅可以轉(zhuǎn)換為整數(shù),也可以轉(zhuǎn)換為浮點(diǎn)數(shù),本文主要介紹了C語言實(shí)現(xiàn)字符串轉(zhuǎn)浮點(diǎn)函數(shù)的示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-02-02
  • C++中操作符的前置與后置有什么區(qū)別

    C++中操作符的前置與后置有什么區(qū)別

    C 語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。接下了讓我們詳細(xì)了解掌握它
    2022-05-05
  • C語言實(shí)現(xiàn)雙人反彈球游戲

    C語言實(shí)現(xiàn)雙人反彈球游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)雙人反彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語言實(shí)現(xiàn)自動(dòng)發(fā)牌程序

    C語言實(shí)現(xiàn)自動(dòng)發(fā)牌程序

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)自動(dòng)發(fā)牌程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論