簡述結構體struct與共用體union的使用

2021-10-05 12:36:30 字數 3773 閱讀 3983

c 陣列允許定義可儲存相同型別資料項的變數,結構是 c 程式設計中另一種使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。

為了定義結構,我們必須使用struct語句。struct 語句定義了乙個包含多個成員的新的資料型別,struct 語句的格式如下:

struct tag  variable-list ;
tag是結構體標籤(結構體名)。

member-list是標準的變數定義,比如 int i; 或者 float f,或者其他有效的變數定義。

variable-list結構變數,定義在結構的末尾,最後乙個分號之前,您可以指定乙個或多個結構變數。下面是宣告 book 結構的方式:

struct books

book;

構造步驟:

1、構造結構體型別;

2、定義結構體變數;

3、使用結構體變數、結構體陣列、結構體指標標量;

結構體構造的三種形式:

//此宣告宣告了擁有3個成員的結構體,分別為整型的a,字元型的b和雙精度的c

//同時又宣告了結構體變數s1

//這個結構體並沒有標明其標籤

struct

s1;//此宣告宣告了擁有3個成員的結構體,分別為整型的a,字元型的b和雙精度的c

//結構體的標籤被命名為******,沒有宣告變數

struct ******

;//用******標籤的結構體,另外宣告了變數t1、t2、t3

struct ****** t1, t2[20], *t3;

//也可以用typedef建立新型別

typedef struct

******2;

//現在可以用******2作為型別宣告新的結構體變數

******2 u1, u2[20], *u3;

注:結構體的成員可以包含其他結構體,也可以包含指向自己結構體型別的指標,而通常這種指標的應用是為了實現一些更高階的資料結構如鍊表和樹等。

為了訪問結構的成員,我們使用成員訪問運算子(.)。成員訪問運算子是結構變數名稱和我們要訪問的結構成員之間的乙個句號。您可以使用struct關鍵字來定義結構型別的變數。下面的例項演示了結構的用法:

#include #include struct books; 

int main( )

當上面的**被編譯和執行時,它會產生下列結果:

book 1 title : c programming

book 1 author : nuha ali

book 1 subject : c programming tutorial

book 1 book_id : 6495407

book 2 title : telecom billing

book 2 author : zara ali

book 2 subject : telecom billing tutorial

book 2 book_id : 6495700

共用體是一種特殊的資料型別,允許您在相同的記憶體位置儲存不同的資料型別。您可以定義乙個帶有多成員的共用體,但是任何時候只能有乙個成員帶有值。共用體提供了一種使用相同的記憶體位置的有效方式。

為了定義共用體,您必須使用union語句,方式與定義結構類似。union 語句定義了乙個新的資料型別,帶有多個成員。union 語句的格式如下:

union [union tag]

[one or more union variables];

union tag是可選的,每個 member definition 是標準的變數定義,比如 int i; 或者 float f; 或者其他有效的變數定義。在共用體定義的末尾,最後乙個分號之前,您可以指定乙個或多個共用體變數,這是可選的。下面定義乙個名為 data 的共用體型別,有三個成員 i、f 和 str:

union data

data;

現在,data型別的變數可以儲存乙個整數、乙個浮點數,或者乙個字串。這意味著乙個變數(相同的記憶體位置)可以儲存多個多種型別的資料。您可以根據需要在乙個共用體內使用任何內建的或者使用者自定義的資料型別。

共用體占用的記憶體應足夠儲存共用體中最大的成員。例如,在上面的例項中,data 將占用 20 個位元組的記憶體空間,因為在各個成員中,字串所占用的空間是最大的。下面的例項將顯示上面的共用體占用的總記憶體大小:

#include #include union data; 

int main( )

當上面的**被編譯和執行時,它會產生下列結果:

memory size occupied by data : 20
注:共用體的定義也有三種形式,且與結構體相同,這裡不再贅述。

為了訪問共用體的成員,我們使用成員訪問運算子(.)。成員訪問運算子是共用體變數名稱和我們要訪問的共用體成員之間的乙個句號。您可以使用union關鍵字來定義共用體型別的變數。下面的例項演示了共用體的用法:

#include #include union data; 

int main( )

當上面的**被編譯和執行時,它會產生下列結果:

data.i : 1917853763

data.f : 4122360580327794860452759994368.000000

data.str : c programming

在這裡,我們可以看到共用體的if成員的值有損壞,因為最後賦給變數的值占用了記憶體位置,這也是str成員能夠完好輸出的原因。現在讓我們再來看乙個相同的例項,這次我們在同一時間只使用乙個變數,這也演示了使用共用體的主要目的:

#include #include union data; 

int main( )

當上面的**被編譯和執行時,它會產生下列結果:

data.i : 10

data.f : 220.500000

data.str : c programming

在這裡,所有的成員都能完好輸出,因為同一時間只用到乙個成員。

結構體或共用體的二級訪問:

#include int main()

u; int k;

}a;a.u.x=4;

a.u.y=5;

a.u.z=6;

a.k=0;

printf("%d\n",a.u.z);

return 0;

}

當上面的**被編譯和執行時,它會產生下列結果:

a.u.z=6

結構體與共用體

1.定義乙個機構體的形式 struct 結構名 2.定義結構體變數 變數名表列 變數名表列 3.結構體成員的表示方法 結構變數名.成員名 例如 boy1.num 如果成員本身又是乙個結構則必須逐級找到最低階的成員才能使用。例如 boy1.birthday.month 4.結構體陣列 方法和結構變數相...

結構體與共用體

結構體的作用 在網路協議 通訊控制 嵌入式系統的c c 程式設計中,我們經常要傳送的不是簡單的位元組流 char型陣列 而是多種資料組合在一起的乙個整體。其表現形式是乙個結構體。簡單來說,結構體就是用來封裝資料的。結構體的定義 struct student struct student stu st...

結構體與共用體

結構體和共用體 聯合體 是自定義的資料型別,常用於處理非數值型資料,使用如 鍊錶 佇列 樹等。1.結構體定義 結構體是用其他型別構造出來的資料型別。結構體型別如下 struct student 定義乙個結構體變數如下 struct student stu1 stu1.age 32 stu1.name...