c
語言中的2種型別:原生型別(如int
、char
等)和自定義型別(struct
,enum
等)。結構體型別是是c
語言中的使用者自定義型別,主要功能是對功能相關的資料進行封裝,它是乙個或多個變數的集合,這些變數的型別可以不同。
例如一名學生可以由姓名和性別來描述,結構體中的成員也可以是乙個結構體,例如名字由姓+名來描述。結構體由關鍵字struct
來宣告。
結構體使用時可以先定義好結構體型別,然後再用定義好的型別來定義變數。
結構體的幾種定義方式:
#include
struct student //定義結構體型別
;int
main
(int argc,
char
**ar**)
#include
struct student
stu;
//定義結構體型別的同時定義了乙個struct student型別的變數stu
intmain
(int argc,
char
**ar**)
#include
typedef
struct student
stu;
//stu是新的型別名 而不是乙個變數
intmain
(int argc,
char
**ar**)
結構體可以認為是從陣列發展而來的。其實陣列和結構體都算是資料結構的範疇了,陣列就是最簡單的資料結構、結構體比陣列更複雜一些,鍊錶、雜湊表之類的比結構體又複雜一些;二叉樹、圖等又更複雜一些。
但是陣列有2個明顯的缺陷:
結構體就是用來解決陣列的第二個缺陷的,可以將結構體理解為乙個其中元素型別可以不相同的陣列。結構體完全可以取代陣列,只是在陣列可用的範圍內陣列比結構體更簡單。
陣列中元素的訪問方式表面上有2種:陣列下標方式和指標方式,實質上這兩種都是指標方式訪問。
結構體變數中的元素訪問方式也是一種,用.
或者->
的方式來訪問。當通過變數名來訪問成員是就用變數名.成員名
來訪問;當通過指標來訪問成員時,就用指標名->成員名
來訪問,舉個栗子:
#include
#include
typedef
struct student
stu;
//stu是新的型別名 而不是乙個變數
intmain
(int argc,
char
**ar**)
這裡要注意的就是第17行,當定義乙個結構體指標的時候還要手動申請乙個該結構體的記憶體,然後把返回的指標給宣告的結構體指標,才能用結構體的訪問方式有點類似於陣列下標的方式,結構體變數成員的->
正確引用。否則記憶體中只分配了指標的記憶體,沒有分配結構體的記憶體,結構體實際上是不存在的。這時候用->
引用會導致segmentation fault (core dumped)
。
.
或者->
訪問本質上也是用指標來訪問的。
通過指標來訪問結構體成員,指標加的值需要考慮到結構體內存對齊:
#include
struct mystruct
;int
main
(int argc,
char
**ar**)
輸出:
s1.a = 12.
s1.b = 5.500000.
s1.c = a.
C語言中的自定義型別 enum列舉
列舉在c語言中其實是一些符號常量集。列舉定義了一些符號,這些符號的本質就是int型別的常量,每個符號和乙個常量繫結。這個符號就表示乙個自定義好的乙個識別碼,編譯器對列舉的認知就是符號常量所繫結的那個int型別的數字。例如可以使用數字1 2 3 4 5 6 7來代表周一到週末,但是純數字並不直觀,這個...
c語言 自定義型別
struct stu 分號不能丟 匿名結構體型別 struct x struct a 20 p p x 非法的操作,上面倆種完全是不同的宣告 struct node 結構體的自引用 struct node n1 null 直接初始化 struct node n2 null 結構體巢狀初始化 先來看下...
C語言自定義型別
在學習c語言的時候,它有很多的自定義型別,例如 結構體,列舉,聯合。這些型別在我們的日常使用的時候,或多或少的都會遇見到,下面就系統的介紹一下這幾種型別。一.結構體 1.結構體型別的宣告 通俗點來說,結構就是一些值的集合,這些值稱為成員變數,結構體的每個成員可以是不同型別的成員變數。如下所示 str...