自定義型別 結構體(1)

2021-08-30 15:35:29 字數 2070 閱讀 8640

結構體與陣列的區別:陣列的元素可以通過下標訪問,這是因為,陣列的長度相同。但是,結構體每乙個成員的長度都可能不同,所以不能通過下標來訪問它們,但是,結構體的每個成員都有自己的名字,結構體是通過名字來訪問的。

結構體宣告

結構體是一些值的集合,這些值稱為它的成員,乙個結構體的各個成員具有不同的型別。

struct tag

varible-list

宣告結構時,必須列出它包含的所有成員,這個列表必須包括每個成員的型別和名字。

我們來舉個栗子:

//例如描述乙個學生

struct student

;

下面兩個例子,是省略了tag的匿名結構體

struct 

x;

這個宣告建立了乙個名叫x的變數,它包含三個成員,乙個整數,乙個字元和乙個浮點數。

struct

y[20], *z;

這個宣告建立了y和z。y是乙個陣列,它包含了20個結構,z是乙個指標,它指向這個型別的結構。

值得注意的是:這兩個宣告雖然成員列表完全相同,但是屬於完全不同的兩種型別。

關於tag的作用:標籤(tag)字段允許為成員列表提供乙個名字,這樣它就可以在後續的宣告中使用。標籤允許多個宣告使用同乙個成員列表。並且建立同一種型別的結構。

來乙個栗子:

struct ******

這個宣告把標籤******和這個成員列表聯絡在一起,該宣告沒有提供變數列表,所以它並未建立任何變數。標籤標識了一種模式,用於宣告未來的變數,但無論是標籤還是模式本身都不是變數。

struct ****** x;

struct ****** y[20],*z;

這裡和最初建立的兩個例子一樣,不過區別在於這裡的x,y,z都屬於同一型別的結構變數。

還有一種和標籤同樣效果的特別技巧——typedf

typedef struct 

******;

這個技巧的區別在於******現在是個型別名,而不是結構體標籤,所以後續的宣告可能像這樣:

****** x;

****** y[20],*z;

特別的:如果想在多個原始檔中使用同乙個型別的結構,應該把標籤或者typedef形式的宣告放在乙個標頭檔案中。當原始檔需要這個宣告時,可以用#include指令將標頭檔案包含。

關於結構體成員:

上面的結構體中我們只使用了簡單的結構體成員,但可以在結構外部宣告的任何變數都可以作為結構體的成員。比如:標量,陣列,指標或者其他結構都可以成為結構體成員。

來個栗子:

struct complex

;

乙個結構成員的名字可以和其他結構的成員名字相同,成員的訪問方式允許指定任何乙個成員而不至於產生歧義。

結構成員的直接訪問

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

//訪問乙個學生的性別

struct student.***;

點操作符的結合性從左到右,和下標操作符具有相同的優先順序。

來個栗子:

((com.sa)[4]).c

com.sa[4].c

當然還是從左到右,依次結合,兩個栗子表達的效果相同。

成員的間接訪問

間接訪問這裡用到了(->)箭頭操作符,和點操作符一樣,接受兩個運算元,但左運算元必須是乙個指向結構的指標,箭頭操作符對左運算元執行間接訪問,取得指標所指向的結構,然後和點操作符一樣,根據右運算元選擇乙個指定的結構成員。

自定義型別 結構體

struct tag 結構體型別名稱 variable list 結構體變數 省略結構體型別名稱 匿名結構體型別 當省略掉結構體型別名稱時,就不能省略掉結構體變數,這樣是不合理的,所以一般我們不建議省略結構體型別名 struct x,y 全域性變數 struct a 20 p int main 注意...

結構體自定義型別的知識

1 結構體是是一些值的集合,這些值被稱為成員變數。2 結構體內的成員可以是不同型別的成員變數。3 建立結構體 struct s 4 結構體內部成員的訪問 1 結構體變數訪問成員 結構變數的成員是通過點操作符 訪問的.操作符接受兩個運算元。如果s是結構體的具體名稱,age 是其內部成員,則s.age就...

自定義型別 結構體 列舉 聯合

結構體 所謂結構體,就是將一大堆值放在一起,建立乙個新的型別,這些成員可以是不同型別的變數。struct tag variable list tag 要求 1.見名知意 2.可以省略 3.不建議省略 member list c語言中,不能為空 variable list 變數列表,可以省略,建議省略...