程式設計師必須弄懂結構體,結構體基礎知識

2021-08-02 11:43:29 字數 2284 閱讀 9689

結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標誌,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體宣告的變數。

struct tag  variable-list ;
在一般情況下,tag、member-list、variable-list這3部分至少要出現2個。以下為示例:

//此宣告宣告了擁有3個成員的結構體,分別為整型的a,字元型的b和雙精度的c

//同時又宣告了結構體變數s1

//這個結構體並沒有標明其標籤

struct

s1;//此宣告宣告了擁有3個成員的結構體,分別為整型的a,字元型的b和雙精度的c

//結構體的標籤被命名為******,沒有宣告變數

struct ******

;//用******標籤的結構體,另外宣告了變數t1、t2、t3

struct ****** t1, t2[20], *t3;

//也可以用typedef建立新型別

typedef struct

******2;

//現在可以用******2作為型別宣告新的結構體變數

******2 u1, u2[20], *u3;

在上面的宣告中,第乙個和第二宣告被編譯器當作兩個完全不同的型別,即使他們的成員列表是一樣的,如果令t3=&s1,則是非法的。

結構體的成員可以包含其他結構體,也可以包含指向自己結構體型別的指標,而通常這種指標的應用是為了實現一些更高階的資料結構如鍊表和樹等。

//此結構體的宣告包含了其他的結構體

struct complex

;//此結構體的宣告包含了指向自己型別的指標

struct node

;

如果兩個結構體互相包含,則需要對其中乙個結構體進行不完整宣告,如下所示:

struct b;    //對結構體b進行不完整宣告

//結構體a中包含指向結構體b的指標

struct a

;//結構體b中包含指向結構體a的指標,在a宣告完後,b也隨之進行宣告

struct b

;

結構體成員依據結構體變數型別的不同,一般有2種訪問方式,一種為直接訪問,一種為間接訪問。直接訪問應用於普通的結構體變數,間接訪問應用於指向結構體變數的指標。直接訪問使用結構體變數名.成員名,間接訪問使用(*結構體指標名).成員名或者使用結構體指標名->成員名。相同的成員名稱依靠不同的變數字首區分。

struct ******

;//宣告結構體變數s1和指向結構體變數的指標s2

struct ****** s1, *s2;

//給變數s1和s2的成員賦值,注意s1.a和s2->a並不是同一成員

s1.a = 5;

s1.b = 6;

s2->a = 3;

s2->b = 4;

在記憶體中,編譯器按照成員列表順序分別為每個結構體變數成員分配記憶體,當儲存過程中需要滿足邊界對齊的要求時,編譯器會在成員之間留下額外的記憶體空間。如果想確認結構體占多少儲存空間,則使用關鍵字sizeof,如果想得知結構體的某個特定成員在結構體的位置,則使用offsetof巨集(定義於stddef.h)。

struct ******

;//獲得******型別結構體所佔記憶體大小

int size_****** = sizeof( struct ****** );

#define offsetof(structname, memname) (int)&((structname*) 0)->memname

//獲得成員b相對於******儲存位址的偏移量

int offset_b = offsetof( struct ******, b );

匿名struct、匿名union以及c++的匿名class,是指既沒有型別名,也沒有直接用這種型別定義了物件;如果緊隨型別定義之後,又定義了該型別的物件,就不算是匿名型別,與普通情形的使用是一樣的。

匿名型別作為巢狀定義,即在乙個外部類(這裡的類是指struct、union、class)的內部定義,則編譯器就在匿名型別定義之後定義乙個無名變數,並把該匿名型別的資料成員的名字提公升到匿名類的外部類的作用域內。如果匿名型別是連續巢狀,則最內部的匿名型別的成員名字被提公升到最外部的可用變數名字訪問的類的作用域內。

例如,

struct sn;  /* 匿名 struct */

} v1;

v1.i=101;

黑馬程式設計師 C語言 結構體

android培訓 ios培訓 期待與您交流!結構體的作用 結構體是一種構造型別,使用非常頻繁。當我們需要把不同型別的資料構成乙個整體時,便會用到結構體了。結構體型別的定義 注意 在函式裡面或者外面都可以定義 影響作用域為全域性型別或者區域性型別 舉例 struct person 此時只是定義了乙個...

《黑馬程式設計師》 結構體struct (C語言)

數 組 只能由多個相同型別的資料組成 結構體 可以由多種不同型別的資料組成 練習 include int main 2.根據結構體型別,定義結構體變數 真正分配儲存空間 struct person p p.age 30 修改結構體元素的值 p.name rose printf age d,name ...

黑馬程式設計師 C語言基礎之 結構體詳解

在實際應用中,某個物件由不同型別的資料組成,比如學生的姓名為字串型,學號可為整形或者字串型,性別為列舉型別,身高為浮點型。很顯然,不可能用乙個陣列來存放這些資料。c語言用一種構造資料型別 結構體來表示這個物件。一 定義結構體變數 結構體和列舉一樣,需要先定義結構體,再定義結構體變數。1 定義結構體 ...