程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言結構體點滴

C語言結構體點滴

編輯:關於C語言

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


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

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


2、定義結構體變量
有了類型就可以定義變量。如:
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];

};


3、初始化
可以這樣:
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賦值。

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


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


數組也是這麼規定的。但是結構體變量之間可以相互賦值,比如:
struct book a,b;
a = b;
當然也僅止步於局部變量。
5、訪問成員變量
兩個符號: . 和 ->,組合起來有三種方式。
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,只不過->專門用於指針,而.用於結構變量本身罷了。


基本內容就這麼多了,以後會繼續補充。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved