聚合資料型別:能夠同時儲存超過乙個的單獨資料(例如c語言中的陣列和結構體)
結構體是一些值的集合,這些值成為它的成員,既是一種自定義型別,也是一種聚合資料型別。
1,宣告
在宣告結構體時,必須列出它包含的所有成員。
struct a
;
a僅僅為乙個標籤,單獨的a並不是結構體的型別,struct a才是。a,c為它的成員列表,一定注意後面的分號千萬不能丟,沒有就出錯了。
struct a
sa1,sa2;
又如這種形式,sa1和sa2是結構體的變數列表,如果沒有標籤的話,記得一定要有,否則還是錯的。
那麼,想要在外部定義乙個結構體型別的變數又該怎麼做呢?
struct a s;
好像依舊很麻煩,因為struct還是不能省略,於是,我們又想到了另乙個辦
typedef struct s
s;
這樣,我們就可以省略struct了,巧妙地運用型別重新命名typedef解決了此問題,有木有很棒呢。s s;
s *ps;
宣告完成之後,該怎樣對它進行賦值呢?
2.初始化
s.a=10;s.name="zhangsan";s.c='w';
是這樣嗎,看似好像沒什麼問題,然而是no,給你說什麼來著,陣列名代表陣列首元素的位址,看看你又忘了,沒好好複習吧,該罰,嘻嘻。當然,你怎麼能將乙個常量字串賦給乙個位址呢,這樣做當然是不對滴。那到底怎樣才算對呢,聽我細細給你道來.
strcpy(s.name,"zhangsan");
又比如ps=&s;
這樣一來,我們就可以通過兩種方式來訪問其內部成員
strcpy(ps-->name,"zhangsan");
strcpy((*ps).name,"zhangsan");
當然,兩種方式的效果是一樣一樣的!
整體初始化:
s s=;
3.巢狀
typedef struct s
s;typedef struct stu
stu;
可通過s.s.a訪問s中的成員a,由此可見,結構體內部的多層巢狀可通過『.』來訪問。
初始化則為:
stu s=,"7417147474741"};
4.結構體的自引用
typedef struct node
node;
注意成員列表中的struct不能省略
5.不完整的宣告
struct b;
struct a
;struct b
;
因為b中用到了a,a中又用到了b,所以當中必須有乙個委曲求全一下,例如b,做了乙個不完整的宣告
typedef struct a
a;
你覺得會輸出幾呢?如果你想的是5,那就錯了,因為你沒考慮到他的記憶體對齊,正確結果是8.再看一下下面一段**:
typedef struct a
a;
你可能說,上次忘了考慮記憶體對齊,這次不會了,於是你信誓旦旦的說答案是12,結果是你又錯了,答案仍然是8,讓我來給你講講為什麼吧!
首先,我們從兩個角度考慮進行分析。
(1)為什麼要記憶體對齊?
(2)記憶體對齊後,如何求取結構體大小?
在這裡,我們需要提到幾個新概念
預設對齊數:每個環境下均不相同chengyuan
vc------>8 vs------->8 linux-------->4
對齊數:成員自身大小和預設對齊數的較小值
偏移數:成員變數在記憶體中偏移的位元組數
規定每個成員必須放到其對齊數的倍數字置處
結構體的大小必須是最大對齊數的倍數
此結構體的大小為8
此結構體的大小仍為8
下面介紹一下結構體中巢狀結構體的記憶體對齊
此結構體的大小為32。
此結構體大小為40,因為結構體的大小必須為整體最大對齊數的倍數
小白眼中的C 結構體
沒辦法老提示我名字重複率太高 如果學過c的結構體,c 的看著還其實還好,如果沒學過的話,請先看一下下面的內容 struct name a 建立了乙個叫a的結構體儲存個人資訊 cin a.age 輸入這個人的年齡,名稱加 可以選擇某一項內容。成員更加標準一點,這樣 運算子又叫做成員運算子。而初始化的話...
我的結構體
我的結構體 使用者自定義的複雜型別,1,定義結構體型別是後面分號不能省略 2,使用struct student st st.成員 賦值注意在其中有char型別成員是不能使用如st.name yellows 應該用strcpy st.name,yellows 3,使用struct student ps...
我,眼中的詩歌
我,眼中的詩歌 給我一杯茶,乙個幽靜的地方,我好看些詩歌。寫前面 詩歌是一種態度。詩歌是燕子低低地飛過屋簷。詩歌是古代西方 盛行的決鬥。詩歌是人類本身一直都存在的 極為樸素的一種本能。詩歌和性別無關 和身材無關,和你曾看過多少書也沒有直接的 聯絡,造物主將嘴巴賦予人類的同時 也賦予了人類詩歌。詩歌是...