c語言的結構體

2021-09-22 14:06:17 字數 1880 閱讀 7192

1.結構體的概念

結構體是一種複合型資料型別,同屬於複合型資料型別的還有聯合體。結構體可以理解為是一種自定義型別,用於對其他資料型別(什麼int型,double型,float型等等)的打包。c語言中正是因為結構體的存在,使其**具有封裝性,可以基於物件導向思想來程式設計。

2.結構體的宣告、定義

假設我們要用結構體來表現乙個班級的資訊,可以為:

struct class_t;

這樣去宣告結構體(上面的宣告操作並不會佔據記憶體空間),在定義 

結構體變數的時候需要指定關鍵字「struct」:

struct class_t class;

另外提一句,c++也有結構體,c++定義結構體變數的時候就不需要「struct」關鍵字。 

在實際運用中,我們會採用typedef宣告的方式:

typedef struct _class_tclass_t;

//或者

typedef structclass_t;

這樣子的宣告方式,就可以直接去掉「struct」關鍵字來定義結構體物件:

class_t class;

除此之外,還有如下幾種常見的宣告方式:

// 1. 前向宣告

struct class_t class;

structclass_t ;

//2. 前向typedef

typedef struct class_t class_t;

structclass_t ;

//3. 宣告立即定義

structclass_t class; 

//適用於只需要生成一次結構體變數的場合

struct class;

3.結構體變數的賦值

對結構體變數內的成員的操作可分為初始化(定義的時候賦值)和賦值2種場合: 

(1)初始化

typedef struct _class_tclass_t;

int main(void)

;return 0;

}還有另外一種初始化方法,可以針對指定變數來初始化:

int main(void)

;return 0;

}這種初始化方法在linux系統底層開發見到的極其多。這兩種初始化方法都屬於批量賦值,注意它們只能在定義結構體變數的時候使用。 

(2)賦值操作

int main(void)

4.結構體在函式間的傳遞

結構體變數在函式間傳遞的時候是具有普通變數的特性,即拷貝原則。

void testfunc(class_t class)

int main(void)

執行結果: 

二者的位址值不同,再次說明,主調函式並非傳遞結構體的位址給被調函式。位址不相同,那麼在被調函式中修改結構體成員的值自然也不會修改到main中函式中的結構體。想要讓形參的修改後能修改到實參,就需要使用結構體指標了。 

結構體變數在函式中的傳遞既然是值拷貝,也就是說可以像普通變數之間的賦值咯,像a = b那樣,確實如此:

int main(void)

執行結果: 

注意,前面講到,對結構體變數的批量賦值操作只能在定義結構體變數的時候使用,即下面操作語法錯誤:

class_t class2;

class3 = ;        //報錯error: expected expression before 『;  

class4 = (class_t);        

--------------------- 

原文: 

C語言的結構體

c語言中的基本資料型別有 整形 浮點型 字元型,復合資料型別 陣列。還有一種構造資料型別,叫 結構體 宣告結構體的形式 struct 結構體名 成員列表可以是c語言的任何資料型別,如 整形 浮點型 字元型 陣列,指標,結構體 共用體 列舉。宣告了乙個結構體,相當於構造了一種新的資料型別,此時系統並不...

C語言的結構體

舉例,乙個結構體的定義如下 typedef struct foo foo 如果直接對上面的結構体作sizeof 運算 printf d n sizeof foo 40 如果在成員名後面加上冒號,指定占用的bits數,可以節省結構體的大小,例如 typedef struct foo foo 可以使用下...

C語言結構體

1.1.1 結構概念 1 結構存在的意義 存在是合理的,許多事物的存在是在不斷解決問題引入的,當然有更好的方法出現時改變也是合理的。在實際問題中,一組資料往往具有不同的資料型別。例如,在學生登記表中,姓名應為字元型,學號可為整型或字元型,年齡應為整型,性別應為字元型,成績可為整型或實型。顯然不能用乙...