乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      結(jié)構(gòu)體的嵌套 自身嵌套 相互嵌套

       _了凡_ 2021-09-25

      什么是結(jié)構(gòu)體的嵌套?

      在結(jié)構(gòu)體的定義中,結(jié)構(gòu)體的成員又是另外一個(gè)結(jié)構(gòu)體的變量。

      結(jié)構(gòu)體嵌套的問題有哪些?

      結(jié)構(gòu)體的自引用,就是在結(jié)構(gòu)體內(nèi)部,包含指向自身類型結(jié)構(gòu)體的指針。

      結(jié)構(gòu)體的相互引用,就是說在多個(gè)結(jié)構(gòu)體中,都包含指向其他結(jié)構(gòu)體的指針。

      結(jié)構(gòu)體應(yīng)該注意的問題?

      結(jié)構(gòu)體定義中可以嵌套其他結(jié)構(gòu)體類型的變量,不可以嵌套自己這個(gè)類型的變量。

      可以嵌套自己類型的指針。

      *********************************自引用結(jié)構(gòu)體******************************

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

      不用TYPEDEF——錯(cuò)誤的方式:    

      1. #include<iostream>
      2. using namespace std;
      3. struct tag_1{
      4. struct tag_1 A; //A是一個(gè)結(jié)構(gòu)體,A的內(nèi)部還會(huì)有一個(gè)結(jié)構(gòu)體,以此下>去,無線循環(huán)。在內(nèi)存分配的時(shí)候,由于無限的嵌套,無法確定結(jié)構(gòu)體的長(zhǎng)度,所>以時(shí)非法的。
      5. int value;
      6. };
      7. int main()
      8. {
      9. return 0;
      10. }

      不用TYPEDEF——正確的方式:    

      #include<iostream>using namespace std;struct tag_1{struct tsg_1 *A;//由于指針的長(zhǎng)度時(shí)確定的(在32位機(jī)器上指針長(zhǎng)度是4),所以編譯器能夠確定該結(jié)構(gòu)體的長(zhǎng)度//這個(gè)指針看似指向自身,其實(shí)不是,而是執(zhí)行同一類型的不同結(jié)構(gòu)。int value;};

      用TYPEDEF——錯(cuò)誤的方式:

      1. #include<iostream>
      2. using namespace std;
      3. typedef struct{
      4. int value;
      5. NODE *link;
      6. }NODE;
      7. //使用typedef為結(jié)構(gòu)體創(chuàng)建一個(gè)別名NODE。
      8. //但是是錯(cuò)誤的,因?yàn)轭愋兔淖饔糜蚴菑恼Z句結(jié)尾開始的,而在結(jié)構(gòu)體內(nèi)部是不>能使用的,因?yàn)檫€沒有定義。

      *********************************相互引用結(jié)構(gòu)體******************************

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

      用TYPEDEF——錯(cuò)誤的方式:

      #include<iostream>using namespace std;typedef struct tag_a{B *bp;int value;}A;typedef struct tag_b{A *ap;int value;}B;//錯(cuò)誤的,在類型B在定義之前就被引用

      用TYPEDEF——正確的方式(“不完全聲明”):

      1. #include<iostream>
      2. using namespace std;
      3. //正確的方式 使用不 完全聲明
      4. typedef struct tag_a A;
      5. typedef struct tag_b B;
      6. struct tag_a
      7. {
      8. // struct tag_b *bp;
      9. B *bp;
      10. int value;
      11. };
      12. struct tag_b
      13. {
      14. // struct tag_a *ap;
      15. A *ap;
      16. int value;
      17. };

      ********************************結(jié)構(gòu)體嵌套的三種正確形式************************

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

      typedef struct tag_1{int value;struct tag_1 *link;}NODE;
      1. typedef struct tag_1 NODE;
      2. struct tag_1
      3. {
      4. int value;
      5. NODE *link;
      6. };
      struct tag_1{int value;struct tag_1 *link;};typedef struct tag_1 NODE;

      結(jié)構(gòu)體自身嵌套時(shí)候要注意:

          結(jié)構(gòu)體內(nèi)部定義了一個(gè)指向結(jié)構(gòu)體的指針,指針的大小在具體的機(jī)器平臺(tái)和編譯器環(huán)境中都是已知的(即使不同的平臺(tái)環(huán)境的定義不完全相同)。但是要提醒的是:這個(gè)指針看似指向自身,其實(shí)不是,而是指向同一類型的不同結(jié)構(gòu)。

      鏈表和樹的數(shù)據(jù)結(jié)構(gòu)就都使用到此技巧。自身的結(jié)構(gòu)體指針指向下一節(jié)點(diǎn)或者下一子樹的地址。

      1. /* 錯(cuò)誤的表示*/
      2. typedef struct //這里是結(jié)構(gòu)體類型的定義
      3. {
      4. int value;
      5. s_ref_1 *link;//注意這局引用了結(jié)構(gòu)體類型名
      6. }s_ref_1;//ISO C 不允許聲明無類型的's_ref_1’
      7. /* 正確的表示*/
      8. typedef struct s_ref_t //這里是結(jié)構(gòu)體類型定義 和 結(jié)構(gòu)體標(biāo)簽
      9. {
      10. int value;
      11. struct s_ref_t *link;//注意這句話與上面相同位置的區(qū)別,使用了標(biāo)簽
      12. }s_ref_2;

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多