C語言中的自定義型別 struct結構體

2021-10-16 13:09:09 字數 2120 閱讀 3638

c語言中的2種型別:原生型別(如intchar等)和自定義型別(structenum等)。結構體型別是是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...