聚合資料結構:陣列
結構體
結構體值的集合稱為成員
陣列通過下標,結構體通過名字訪問–區別非常重要
結構體與陣列不一樣,並不能替換為指標。
結構體屬於標量不能進行加減乘除,但可以賦值
在c語言中,並沒有規定結構體所分配的記憶體是連續的,但是有些編譯器會分配連續的空間給結構體
struct
z;struct
y;z = y
//error 不能將struct 型別的值分配到struct
struct a
f;//**a標識了一種模式,用於宣告變數。**
typedef
struct b
h;//因為有typedef的存在,所以在這裡h表示的是一種型別,而不是一種變數。
結構體中可以包含很多態別的資料
struct com
;
com.h;
(com
.a).a
;//雙結構體的直接訪問
(com
.c)[4]
//下標引用和點操作符具有相同的優先順序
如果有指向結構體的指標,則用箭頭運算子來進行間接訪問成員。
structas;
struct
as *p;
p->a;
p->b;
//or
(*p).a;
(*p).b;
這是兩種操作符的區別
struct st
;//error 會導致結構體無限制的引用下去
struct st1
//ok.
typedef
struct
st2;
//error st2為自己所定義的型別,但是在這個型別內部,這個結構體還沒定義就已經使用,明顯是非法的。
typedef
struct
ex2;
typedef
struct ex
ex;ex x= },0};
ex *px = &x;
再次重申:
在c語言中,並沒有規定結構體所分配的記憶體是連續的,但是有些編譯器會分配連續的空間給結構體
px指向結構體的第乙個元素。
*(p+1)是非法的,原因同上
比較*p and p->a;
這兩種操作都是指向結構體的第乙個元素,但是略有不同。
*p指代的是整個結構體
p->a,指向的是他的第乙個成員。
int *fp;
fp = p;//error,型別不匹配
p->c.a
p->c指向結構體c,結果並不是乙個指標,而是乙個變數。所以用c.a來直接訪問
*(p->c.b)指向結構體c的陣列b的第乙個元素
由於結構體本身就是自定義的資料型別,定義結構體變數的方法和定義普通變數的方法一樣。
注意:結構體生命的時候本身不占用任何記憶體空間,只有當你用你定義的結構體型別定義結構體變數的時候計算機才會分配記憶體。
結構體,同樣是可以定義指標的,那麼結構體指標就叫做結構指標。
結構體可以描述陣列不能夠清晰描述的結構,它具有陣列所不具備的一些功能特性。
void print_score(struct a*pn)的效率是要高過void print_score(struct a pn)的,因為直接記憶體操作避免了棧空間開闢結構變數空間需求,節省記憶體。
結構與聯合
結構體需要注意那些知識點?1 陣列是為了更清晰的記錄有限個相同型別的資料資訊而誕生的一種表示形式。結構體是為了更清晰的記錄乙個具有不同型別屬性特性的物件而誕生的一種表示形式。聯合與結構都是由多個不同的資料型別成員組成,但在任何同一時刻,聯合中只存放了乙個被選中的成員,而結構的所有成員都存在。也就是說...
結構與聯合
結構和聯合都是由多個不同的資料型別成員組成,但在任何同一時刻,聯合中只存放了乙個被選中的成員 所有成員共用一塊位址空間 而結構的所有成員都存在 不同成員的存放位址不同 對於聯合的不同成員賦值,將會對其它成員重寫,原來成員的值就不存在了,而對於結構的不同成員賦值是互不影響的。include union...
結構體列舉與聯合
基本介紹 struct是結構體的關鍵字,它將一些相關聯的資料打包成乙個整體,這些相關聯的資料可以是不同的型別。它們被稱為結構體的成員,結構體的成員可以是標量 陣列 指標 或者是其他結構體。結構的宣告 假設我們要建立學生檔案,要納入學生的姓名,年齡和性別三個內容。那麼我們可以通過建立乙個結構體來實現這...