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