C語言複習之結構體基礎知識

來源:互聯網
上載者:User
一.基礎知識

1.彙總資料類型(aggregate data type)能夠同時儲存超過一個的單獨資料。C提供了兩種類型的彙總資料類型,數組和結構。

(1)數組是相同類型的元素的集合,它的每個元素是通過下標引用或指標間接訪問來選擇的。

(2)結構也是一些值的集合,這些值稱為它的成員(member),但一個結構的各個成員可能具有不同的類型。

2.數組元素可以通過下標訪問,這隻是因為數組的元素長度相同。

3.由於一個結構的成員可能長度不同,所以不能使用小標來訪問它們。相反,每個結構成員都有自己的名字,它們是通過名字訪問的。

4.結構並不是一個它自身成員的數組。和數組名不同,當一個結構變數在運算式中使用時,它並不被置換成一個指標。結構變數也無法使用下標來選擇特定的成員。

5.結構變數屬於標量類型,結構也可以作為傳遞給函數的參數,它們也可以作為傳回值從函數返回,相同類型的結構變數相互之間可以賦值。

6.可以聲明指向結構的指標,取一個結構變數的地址,也可以聲明結構數組。

二.結構聲明

1.在聲明結構時,必須列出它包含的所有成員。該列表包括每個成員的類型和名字。

eg:

struct  tag{

                    member-list;

}variable-list;

結構體聲明由三部分組成,tag,member-list,variable-list。所有可選部分不能全部省略---它們至少出現兩個。

1>例子:

struct  {

                   int   a;

                      char  b;

                      float  c;

}x;

這個聲明建立了一個名叫x的變數,它包含三個成員:一個整數、一個字元和一個浮點數。

struct  {

                      int    a;

                      char   b;

                      float   c;

}y[20],*z;

這個聲明建立了y和z。y是一個數組,它包含了20個結構。Z是一個指標,它指向這個類型的結構。

2>說明:

以上兩個聲明被編譯器當作兩種截然不同的類型,即使它們的成員列表完全相同。因此,變數y和z的類型和x的類型不同,所以下面這條語句。

z = &x;是非法的

3>但是,這是不是意味著某種特定類型的所有結構都必須使用一個單獨的聲明來建立呢。其實不然,標籤(tag)欄位允許為成員列表提供一個名字。

eg:

struct  SIMPLE  {

            int   a;

            char  b;

            float  c;

};

這個聲明把標籤SIMPLE和這個成員列表聯絡在一起。該聲明並沒有提供變數列表,所以它並未建立任何變數。

² 標籤標識了一種模式,用於聲明未來的變數,但無論是標籤還是模式本身都不是變數。

eg  struct  SIMPLE  x;

 struct SIMPLE  y[20],*z;

這些聲明使用標籤來建立變數。它們建立和前面的例子是一樣的,不同的是:現在x,y和z都是同一種類型的結構變數。

2.聲明結構時可以使用的另一種良好技巧是用typedef建立一種新的類型。

typedef  struct  {

           int    a;

           char   b;

           float   c;

} Simple;

這個技巧和聲明一個結構標籤的效果幾乎相同。區別在於:Simple現在是個類型名而不是個結構標籤,所以後續的聲明可能像下面:

Simple  x;

Simple  y[20],*z;

註:如果想在多個源檔案中使用同一種類型的結構,你應該把標籤聲明或typedef形式的聲明放在一個標頭檔中。當源檔案需要使用這個聲明時可以使用#include指令把該標頭檔包含進來。

3.結構成員

1>結構成員可以是任何變數。結構成員可以是標量,數組,指標或者是其他結構。

2>一個結構的成員的名字可以和其他結構的成員的名字相同。並不會產生衝突。

三.結構成員的訪問

1.結構成員的直接存取

結構變數的成員是通過點操作符號(.)訪問的。點操作符接受兩個運算元,左運算元就是結構變數的名字,右運算元就是需要訪問的成員的名字。這個運算式的結果就是指定的成員。

2.結構體成員的間接訪問

如果你擁有一個指向結構的指標,我們使用->操作符(箭頭操作符)和點操作符一樣,箭頭操作符對左操作符執行間接訪問取得指標所指向的結構,然後和點操作符一樣,根據右運算元選擇一個指定的結構成員。

3.結構的自引用

在一個結構內部包含一個類型為該結構本身的成員是否是合法呢?

Eg:

struct  SELF_REF1 {

           int   a;

           struct  SELF_REF1 b;

           int   c;

};

該中類型的應用是非法的,因為成員b是另一個完整的結構,其內部還將包含它自己的成員b。這第2個成員又是另一個完整的結構,它還將包含它自己的成員b。這樣就會永無止境。

1>下面的方法是合法的

struct  SELF_REF2 {

           int    a;

           struct   SELF_REF2 *b;

           int     c;

};

這個聲明和前面的聲明區別在於b現在是一個指標而不是結構。編譯器在結構的長度確定之前就已經知道指標的長度。所以該中類型的自引用是合法的。

2>以下是個錯誤的用法

typedef  struct {

                 int          a;

                 SELF_REF3   *b;

                 int          c;

}SELF_REF3

該聲明的目的是為這個結構建立類型名SELF_REF3。但是,它是錯誤的,類型名直到聲明的末尾才定義,所以在結構聲明的內部它尚未定義。

使用一個結構標籤來聲明b,如下所示:

typedef  struct SELF_REF3_TAG {

           int      a;

           struct     SELF_REF3_TAG  *b;

           int       c;

}SELF_REF3;

4.不完整的聲明

有時候,你必須聲明一些相互之間存在依賴的結構。即:其中一個結構包含了另一個結構的一個成員或多個成員。和自引用一樣,至少有一個結構必須在另一個結構體內部以指標的形式存在。問題在於聲明部分:如果每個結構都引用了其他結構的標籤,哪個結構應該首先被聲明呢?

1>該問題採用不完整聲明來解決。它聲明一個作為結構標籤的標識符。然後,把這個標籤用在不需要知道這個結構的長度的聲明中,如聲明指向這個結構的指標。接下來的聲明把這個標籤與成員列表聯絡在一起。

2>看下面的例子,兩個不同類型的結構內部都有一個指向另一個結構的指標。

struct  B;

struct  A  {

           struct  B *partner;

           /*other declarations*/

};

struct  B {

           struct  A  *partner;

           /*other declarations*/

};

在A成員列表中需要標籤B的不完整的聲明。一旦A被聲明之後,B的成員列表也可以被聲明。

四結構的初始化

1.結構的初始化方式和數組的初始化方式很相似。一個位於一對花括弧內部、由逗號分隔的初始值列表可用於結構各個成員的初始化。這些值根據結構成員列表的順序寫出。如果初始列表的值不夠,剩餘的結構成員將使用預設值進行初始化。

2.結構中如果包含數組或結構成員,其初始化方式類似於多維陣列的初始化。一個完整的彙總類型成員的初始值列表可以嵌套於結構的初始值列表內部。

eg:

struct  INIT_EX {

           int   a;

           short  b[10];

           Simple  c;

}x = {

           10;

           {1,2,3,4,5},

      {25,’x’,1.9}

};

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.