結構體和共同體

2021-07-14 04:26:56 字數 3326 閱讀 4487

結構體適用用是將不同型別的資料成員組合到一起,適用於關係緊密和邏輯相關的資料進行處理;

與共同體相比較而言,共同體雖然也能表示不同型別資料的資料集合,但是其資料成員的情形是互斥的,每一時刻只有乙個資料成員起作用,例如乙個人的婚姻狀況,未婚、已婚、離婚,這三個狀態在某一時期只能存在一種情況。

struct 結構體變數名

;

struct student

;

struct student stu;
(2)再宣告結構體模板的同時定義結構體變數

struct student

stu; //只需在模板結尾處定義即可;

typedef

struct student student;

(2)在宣告模板的時候定義別名:

typedef

struct student

student;

這樣再給起了乙個別名之後,我們就可以愉快的使用他來定義結構體變數了

struct student stu1, stu2;

student stu1, stu2; //我是不是比他要帥好多啊!

student stu1 = ...

.};

typedef struct date

date;

下面我們來做袋鼠媽媽:

typedef

struct baby

baby;

stu1.brithday

.years = 2016

;stu1.brithday

.month = 06

;....

stu1 =stu2;    //這是同型別變數之間的賦值操作;
結構體成員也可以進行使用賦值運算子來進行賦值,但是對於字元陣列型別的結構體變數進行賦值時,必須用字串處理函式來進行賦值:

stu1.brithday,years = stu2.brithday

.years

;

strcpy(stu1.name,stu2.name);
#include "stdio.h"

typedef

struct sample

sample;

int main()

;printf("bytes = %d\n", sizeof(s) );

return

0; }

結果是:bytes = 12;

這是為什麼呢?

我們下面來捋一捋,乙個字元佔1個位元組,乙個數字佔4個位元組,但是為什麼是12個位元組呢(1+4+1 = ?),這裡呢引入了記憶體對齊的需求,未滿足處理器的對齊要求,可能會在較小的成員後面新增補位,所以會將兩個字元的位元組數擴充套件到4個,在其後面新增3個補位,所以4*3 = 12。

由此可見,系統為結構體變數分配的記憶體大小,不僅與定義的結構體型別有關,還與計算機本身有關。

student

stu[30];

student stu[30] = },

},},

......

};

student *p =&stu;
接下來我來介紹另乙個訪問結構體變數成員的運算子,叫做指向運算子,也叫箭頭運算子;

語法:指向結構體的指標變數->成員名

p->studentid =110112112;
指向結構體陣列的指標其實和指向一般陣列的指標原理是一樣的

student *pa = stu;

等價於student *pa = stu[0];

其實也還能寫成:

student *pa;

pa =stu;

其實這種方法和一般的普通型別的變數做函式引數一毛一樣,都是傳值呼叫,對結構體原來的成員變數不會有變化。

用結構體變數做函式的實參,其實就是將結構體的完整結構和內容給被調函式,這種方法也是傳值呼叫不會對原來的結構體造成影響。

#include "stdio.h"

typedef struct date

date;

date func(date stu) //結構體作為函式的返回值;

int main()

結果:

before function call:1996/ 9/21

after function call:2016/ 6/29

共用體,也叫聯合,是將不同型別的資料組合到一起共同占用同一段記憶體的構造資料型別,定義方法與結構體類似,關鍵字是union;

#include "stdio.h"

union sample

;typedef

union sample sample;

int main()

運算結果是:bytes=4

為啥會是4個呢,我們再來看一下,short佔2個位元組,char佔乙個位元組,float佔4個位元組。我們前面不是說共用體是將資料組合放到一塊記憶體上面的嗎?所以必須他有足夠大的記憶體來佔據記憶體空間最大的那塊記憶體,所以共用體所佔記憶體空間的大小取決於其成員中佔記憶體空間最大的那個成員變數。

由於同一塊記憶體在每一瞬間只能存放一種資料型別的成員,也就是說同一時刻就只有一各成員是有意義的。每一瞬間起作用的成員就是最後一次被賦值的成員,所以不能為共用體所有成員進行初始化,只能對第乙個成員進行初始化,還有就是共用體不能做比較操作,也不能作為函式引數。

與結構體相似,可以通過成員選擇運算子和指向運算子來訪問共用體成員變數:

sample num;

num.i =20;

union maritalstate

;struct person

;

z這裡我來簡要說明一下marryflag,這其實是乙個標記項,所以我們可以這樣定義:

marryflag為1時,表明未婚;

marryflag為2時,表明已婚;

….

結構體和共同體

結構體 定義多個不同型別的成員變數組合在一起,以實現複雜的資料結構。格式 struct 標籤名 變數1 變數2 或者 typedef struct 標籤名 示例 struct books book 當兩個結構體互相包含,則需要對其中乙個結構體進行宣告 宣告 struct b 結構體a指向結構體b s...

結構體,共同體

共用體 構造資料型別,也叫聯合體 用途 使幾個不同型別的變數共佔一段記憶體 相互覆蓋 結構體是一種構造資料型別 用途 把不同型別的資料組合成乙個整體 自定義資料型別 結構體變數所佔記憶體長度是各成員佔的記憶體長度的總和。共同體變數所佔記憶體長度是各最長的成員佔的記憶體長度。共同體每次只能存放哪個的一...

C 結構體和共同體

一 定義結構體三種方法 1.先宣告結構體型別再定義變數名。2.在宣告型別的同時定義變數。3.直接定義結構體型別變數。struct student 二 共同體 引用方式 只有先定義了共同體的變數才能引用它。而且不能引用共同體變數,只能引用共同體變數中的成員 union teacherteacher 下...