結構體是c語言中的明顯的構造型別,相對於只能儲存相同型別元素的陣列,結構體是存放不同型別資料的集合。結構體一般會在處理資料資訊時使用。
構造結構體定義,型別為 struct person
struct person
;
上述形式只是定義了乙個型別,型別中有 number、***、money這些內容。
結構體的使用,使用結構體型別定義變數
struct person p1;
// 注意 struct person 是乙個完整的型別, p1 才是結構體變數。
如果要訪問結構體成員,需要使用成員訪問運算子.
p1.number =1;
p1.*** =
'f';
p1.money =
62.5
;printf
("%d %c %lf"
, p1.number, p1.***, p1.money)
;
以上是賦值的操作,但是如果加上const
則只能通過初始化的方式進行賦值。
const
struct person example_person =
;
在結構體成員初始化中,可以按照型別的格式給部分成員進行初始化,但是會按照定義的先後順序進行匹配,而不是按照型別進行匹配。
也可以通過傳參的方式進行處理
void
print_person
(struct person p)
print_person
(example_person)
;
也可以定義結構體陣列,用於存放建立的結構體,然後通過陣列的遍歷進行訪問
struct person arr=
,,};
除此之外,結構體內部也可以存放陣列和結構體。
struct date
;struct person
;
此時對內嵌結構體成員的訪問形式為p.birthday.year
先單層訪問到 birthday,再訪問到 year。
這裡注意,當在結構體中定義了乙個 char 型別的陣列時,可以通過初始化為其賦值,也可以通過strcpy(p.name, "li hua")
的方式進行賦值,但是不能直接使用p.name = "li hua"
,因為p.name
是乙個陣列名,相當於乙個指標常量,固定指向這個陣列的第乙個位址,該錯誤用法的含義是向指標常量賦值,顯然是不可行的。
在結構體型別宣告時,會使用固定的struct ***
形式,並且在後續的使用中都要以這樣的形式完整的出現,因此,為結構體起乙個別名,可以更加方便的使用結構體變數。
struct person
p;
這裡的 p 是乙個全域性變數,可以通過p.***
的形式直接訪問成員,但是不推薦以直接定義全域性變數的形式建立結構體變數,因為全域性變數會在程式執行期間一直消耗記憶體空間。
typedef
struct person
p;
此時定義的p是乙個型別,就可以通過該型別建立變數,即結構體的別名。
p p1;
如果不需要內嵌,那麼就可以使用匿名結構體,即:
typedef
struct
p;
如果將結構體的定義放到乙個函式中,並想要在函式的外部進行使用,只能在外部重新再次定義結構體,因為結構體定義在函式內部,無法在外部獲取其定義。
此外還要注意,結構體的定義要在使用之前。
struct person
;
建立了乙個這樣的結構體後,可以使用sizeof()
檢視結構體所佔記憶體的大小。
影響結構體所佔記憶體大小的主要因素有:本身成員變數的型別、結構體存在位元組對齊
結構體位元組對齊是指,如果下乙個成員無法在有限的空間內存放,則需要額外的空間,開闢的空間應是結構體內部最大的單成員變數的整數倍。例如上述結構體中,自身對齊最大的為double
型別,其占用8個位元組,因此int
和char
就要共同占用8個位元組以保證和最大單元對齊,此時占用記憶體大小為 16 位元組,如果將結構體中的變數宣告順序調換一下
struct person
;
同樣的是與 8 位元組的double
型別進行對齊,但int
和char
是分開的,無法再共同占用8位元組,所以此時的結構體占用的記憶體大小為24。
那麼如何優化位元組對齊呢?第一種方式是按照有限空間合理排布成員順序,第二種是通過#pragma pack(size)
來更改位元組對齊的方式。
#pragma pack(1)
// 位元組對齊按照1位元組對齊,無額外空間的方式,直接等於所有位元組大小相加
// size允許的取值為1、2、4、8、16,即與實際的基礎型別位元組大小相匹配
struct person
;
位域,也是一種優化結構體占用記憶體的方式,針對於整數型別的成員變數,可以通過位域指定其所佔記憶體位的多少,但要注意,無法超越其本身的位數,例如,char
型別不能超過8位。
struct person
;
定義方式:
union message
;
使用共用體型別建立變數union message m1
,共用體所佔記憶體的大小只與最大的元素的大小有關,其對於共用體的大部分操作和結構體一樣。但需要注意,因為共用體只有乙個記憶體,不可以按照結構體初始化的方式對所有成員變數進行初始化。其初始化只需要對其中某乙個成員進行初始化。
列舉的定義:
enum week
;enum week w1 = mon;
列舉型別其本質還是正整數型別,可以為列舉元素指定其值的大小。 C語言結構體與結構體指標的使用
c語言結構體 struct 是由一系列具有相同型別或不同型別的資料構成的資料集合。說的通俗一點就是乙個集合。c語言是一門面向過程的程式語言,而結構體的使用在某些層次上跟物件導向有點異曲同工之處了。下面回歸正題,學習一下結構體以及結構體指標的知識。一 結構體變數的定義和初始化 1 首先我們來看一下結構...
C 語言 結構體的定義與使用
1 先定義結構體,在定義結構體變數 struct stu 定義結構體 struct stu student1 定義結構體變數 2 定義結構體同時定義結構體變數 struct stu student 還可以在定義結構體變數 struct stu student1 3 直接定義結構體型別變數 struc...
C語言結構體的定義與使用
1.結構體 存放不同資料的集合 1 結構體內可以放入結構體 typedef unsinged short ushort struct date 2 結構體內可以放入陣列 char name 20 code struct define.c 3 include includesturct person ...