热门问题
时间线
聊天
视角
資料型態 (C語言)
来自维基百科,自由的百科全书
Remove ads
在C語言中,資料型態可以分為兩類:基礎資料型態和複合資料型態。
基礎資料型態
注意:以下是典型的資料位長和範圍。編譯器可能使用不同的資料位長和範圍。請參考具體的參考。
在標準標頭檔limits.h 和 float.h中說明了基礎資料的長度。float,double和long double的範圍就是在IEEE 754標準中提及的典型資料。另外,C99添加了新的複數類型,C11添加了原子類型,它們不在本條目討論範圍內。關於這些類型的具體含義和部分細節,參見資料類型,最後一列寫出了這些類型在硬體層面的類型(x86&x86_64實現)
註:粗體為C99所新增的類型。
Remove ads
複合資料型態
在C語言中,複合資料型態可分為三類:結構、聯合和列舉。在現代C語言中,聯合和列舉的使用頻率已逐漸減少。
結構(structure variable)允許構造由多個基礎資料型態組合而成的複雜結構[2]。結構為物件導向程式設計的藍本。以下範例通過結構和結構體裡的指標實現了二元樹結構:
typedef struct Bintree {
int data;
struct bintree *lchild; // left child of the node
struct bintree *rchild; // right child of the node
} bintree; // 自定义 bintree 类型
為結構定義變數時通常會用到動態主記憶體分配:
#define mktree() (bintree *)malloc(sizeof(bintree)) // 分配该结构所需的内存单元数量
bintree *tree;
tree = mktree(); // 分配到 tree 指针
tree->data = 1;
tree->lchild = mktree();
...
由於C語言不具備自動垃圾收集(Garbage Collection)功能,使用完畢後呼叫free(treePtr)
來釋放之前通過malloc(size)
分配的主記憶體。詳見這裡。
在C99標準中,還添加了名為伸縮型陣列成員的特性[3],關於此特性的內容超出了該條目的介紹範圍,若需了解更多資訊可參見文件或其它材料。
聯合(union)與結構相類似,但不同的是,聯合在某一特定時刻只有最後被使用的成員的值是確定的,因此一個聯合只使用所有成員中所占空間最大的成員所使用的主記憶體。然而,一些編譯器可以通過編譯參數或#pragma的方式強制聯合使用與所有成員所占儲存空間的和相等的儲存空間,在這種情況下,除最後被使用的成員外,其餘成員的值是未定義的[2]。以下給出了聯合的一個聲明:
union foo{
int bar;
double foobar;
};
foo.bar = 8;
foo.foobar = 3.14;
在這個例子中,假設使用32位元平台編譯,一個double變數占8位元組,一個int變數占2位元組(由上表得),則該聯合所占大小即為double類型的大小——8位元組。在這段程式執行完畢後,foo.bar的值是未定義的,而foo.foobar的值為3.14。
Remove ads
列舉(enumerated type)用來聲明一組整數常數。預設情況下,列舉聲明格式為enum type {value1,value2,...,valuen};此時value1,value2分別為0,1,直到n-1。事實上,列舉類型在C語言實現中是以int類型儲存的[2]。以下是列舉的一個聲明:
enum a { b , c , d };
在此之後,便可以以如下方式使用:
enum a foo;
foo = b;
if(foo != c) //等同于if(foo != 1)
{
do_something();
}
而此時的b,c,d分別為0,1,2。 另外,也可以手動為列舉列表中的常數賦值。下面是一個例子:
enum colour {red = 100,blue = 700,yellow = 200};
則此時red,blue,yellow的值分別為100,700,200.
需要注意的是,列舉在C和C++中所表現的行為有一些細微的差異。參見C與C++的相容性。
Remove ads
參考文獻
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads