C語言結構體點滴

結構的本質是C語言的一種數據抽象,通俗的說,是基本數據類型的重組。爲何要重組呢?由於基本數據類型不夠用了。爲何不夠用了呢?由於須要的信息類型太多了。這是一個很大的話題。信息原本是沒有什麼類型之分的,可是爲了便於在計算機內部的管理,人們在C語言中把信息先分紅了基本的幾個類型,好比整型、浮點型、字符型、布爾型等等。可是呢,描述一個事物的所有信息有時候僅用一種基本類型是不夠的,好比一本書的基本屬性:做者(字符型)、價格(浮點型)、出版日期(我也不知道什麼型)、書名(字符型)。然而操蛋的是,咱們要處理的並不是是這本書的某個屬性,而是總體,這時候咱們只好把各類類型組合起來構造一種全新的數據類型——這正是發揮咱們想象力和創造力的時候。除了基本類型之外並由其組合而成的新類型統稱爲結構體。數組

 

一、在C語言中,要創造一個全新的數據類型,首先要定義這麼一個類型。告訴編譯器這個新類型由哪些基本類型組成。標準的定義形式以下: 
struct book
{
int price;
char title[44];
};ide

首先是關鍵字struct,代表這不是一個基本類型;而後是一個標記(tag),至關於給新類型起的名字,可是這個名字並不是必須的,下面會談到爲何寫上比較好;最後是新類型的成員,須要放在花括號裏面且代表基本數據類型。須要注意的是,末尾須要加上分號,由於這只是類型定義,屬於一種聲明,聲明都要以分號結尾。類型定義並不分配內存空間,他只是創造了一個模版,之後用這個模版定義變量的時候才真正的分配內存。指針

 

二、定義結構體變量
有了類型就能夠定義變量。如:
struct book 
{
int price;
char title[44];
} a, b;
a和b被定義爲struct book類型的變量,而後按照模版分配內存空間。
也能夠這樣定義變量:
struct
{
int price;
char title[44];
} a; 

以上兩張形式的定義區別在於:一個有tag一個沒有。但不管哪種都略顯臃腫,尤爲是成員衆多的時候。這時,tag的做用就顯示出來了,咱們能夠簡化定義的形式:
struct book a, b;
注意struct不能省略,tag必須和struct一塊兒使用,才能至關於int、float等基本類型。而沒有tag直接定義變量的形式就不能享受這種便利了。並且tag的做用並不是僅限於簡化定義形式,實際上,只有定義了tag,這個模版(新類型)才能夠被反覆使用(即定義變量)而不引發混淆。像下面這樣:
struct
{
int price;
char title[44];
} a; 


struct
{
int price;
char title[44];
} *b; 


要注意兩個結構體是不一樣的,至少在編譯器眼裏是不一樣的,即便他們的成員同樣。好比 b = &a; 這是非法的。而有了tag就能夠避免這樣的混淆——tag能夠把成員相同的結構默認爲同一種類型。
另外,不加tag的形式只能在定義變量的時候使用,換言之,下面的類型定義(聲明)是沒有意義的:
struct
{
int price;
char title[44];內存

};編譯器

 

三、初始化
能夠這樣:
struct book a = {43.5, "agv"};
成員之間用逗號隔開,同時成員順序要和模版保持一致,即類型要匹配。若是成員比模版聲明的要多就會報錯;若是少於模版數量,未指定值的項目會被置爲0或空;多餘的逗號不會報錯。
也能夠這樣:
struct book a = {.title = "agv", .price = 43.5};
這種形式就沒必要按照模版的順序賦值,可是要注意一點,若是這樣:
struct book = {.title = "agv", .price = 23.1, "ree"};
那麼最後title的值究竟是多少?答案是「ree」,先前的會被後來的覆蓋。由於title的確是在price以後的,price賦值後很天然的繼續給title賦值。

it

初始化的時候,若結構體變量是全局變量,則必須使用常量表達式初始化成員;若結構體是局部變量,則能夠是變量表達式初始化成員。編譯

 

四、賦值
賦值和初始化是不一樣的(多麼痛的領悟啊)!!!!!
結構體基本上沒有賦值這一說,好比下面的作法是錯的:
struct book a;
a = {.title = "agv", .price = 43.5};


數組也是這麼規定的。可是結構體變量之間能夠相互賦值,好比:
struct book a,b;
a = b;
固然也僅止步於局部變量。
五、訪問成員變量
兩個符號: . 和 ->,組合起來有三種方式。
struct book a;
printf("a.title\n");


struct book *b;
b = &a;
printf("b->title\n");


struct book *b;
b = &a;
printf("(*b).title\n");


這裏顯然有b->title == a.title,只不過->專門用於指針,而.用於結構變量自己罷了。


基本內容就這麼多了,之後會繼續補充。如今植髮是通常須要多少class

相關文章
相關標籤/搜索