深入浅出之构造类型
一、構(gòu)造類型的概念
?構(gòu)造類型也稱為組合類型,是由基本類型按照一定規(guī)律組合而成。
二、數(shù)組類型
數(shù)組是由同類型數(shù)組組合而成的序列,用一個(gè)統(tǒng)一的數(shù)組名來標(biāo)識(shí)這一組數(shù)據(jù)。
2.1 數(shù)組定義
一維數(shù)組:類型標(biāo)識(shí)符 數(shù)組名[常量表達(dá)式];
二維數(shù)組:類型標(biāo)識(shí)符 數(shù)組名[常量表達(dá)式][常量表達(dá)式];
三維數(shù)組:類型標(biāo)識(shí)符 數(shù)組名[常量表達(dá)式][常量表達(dá)式][常量表達(dá)式];
2.2 數(shù)組的初始化
1) 定義數(shù)組的同時(shí)可以直接給數(shù)組中的元素賦初值,將需要賦的值一一列舉并用一對(duì)大括號(hào)括起來,然后用逗號(hào)分隔即可。
如:
int array[5]={1,2,3,4,5};2) 只給數(shù)組中的部分元素賦初值;
int array[5]={1,2,3};其余元素值均為0
3)如果初始化數(shù)組時(shí),全部給出,可以不指定數(shù)組長度
int array[]={1,2,3,4,5};?2.3 數(shù)組元素的引用
方式1:下標(biāo)法
格式:數(shù)組名[下標(biāo)]
方式2:地址法
格式:*(數(shù)組名+下標(biāo))
#include <QCoreApplication> #define f(x) x*x #define g(x) (x)*(x) #define h(x) ((x)*(x)) int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);int array[5] = {1,2,3,4,5};qDebug("%d",array[3]);qDebug("%d",*(array+3));int *p = array;qDebug("%d",*(p+3));int *pp = &array[3];qDebug("%d",*pp);return a.exec(); } 輸出結(jié)果: 4 4 4 42.4 字符串與字符數(shù)組
? ? ? ?字符串是若干個(gè)有效字符(字母、數(shù)字、專用字符、轉(zhuǎn)義字符等)的序列。C語言中沒有字符串變量,字符串不是存放在一個(gè)變量中,而是存放在一個(gè)字符型數(shù)組中。因此,為了存放字符串,常常在程序中定義字符型數(shù)組。
? ? ? ?字符串與字符數(shù)組兩個(gè)術(shù)語在含義上有區(qū)別,字符串存放在字符數(shù)組中,但字符數(shù)組與字符串可以不等長,字符串以“\0”作為結(jié)束標(biāo)志。
字符數(shù)組的賦初值
1) 逐個(gè)為元素值賦初值
char str[2]={'a','b'};
2)? ?對(duì)字符數(shù)組指定一個(gè)字符串初值
char str[]={"abcd"};
注意:單個(gè)字符是用單括號(hào)括起來,而字符串是用雙括號(hào)括起來,在指定字符串賦初值時(shí),將字符串中各個(gè)字符逐個(gè)賦給字符數(shù)組中各個(gè)元素,但要注意一點(diǎn)是系統(tǒng)會(huì)自動(dòng)地在最后一個(gè)字符后面加入一個(gè)‘\0’字符。
三、結(jié)構(gòu)體類型
3.1 結(jié)構(gòu)體類型
格式:
struct 結(jié)構(gòu)體名{
? ? ? 成員項(xiàng)表列;
};
注意:不要忘寫花括號(hào)外的分號(hào)
結(jié)構(gòu)體類型特點(diǎn):
1) 它由若干個(gè)數(shù)據(jù)項(xiàng)組成,每一個(gè)數(shù)據(jù)項(xiàng)都屬于一種已有定義的類型,每個(gè)數(shù)據(jù)項(xiàng)都稱為一個(gè)結(jié)構(gòu)體的成員,也可以稱為“域”。
2)結(jié)構(gòu)體類型并非一種,而可以由很多種,這與基本類型不同。
3)定義一個(gè)結(jié)構(gòu)體類型,并不意味著系統(tǒng)將分配一段內(nèi)存單元來存放各數(shù)據(jù)項(xiàng)成員。注意:這是定義類型而不是定義變量,定義一個(gè)類型只是表示這個(gè)類型的結(jié)構(gòu),即告訴系統(tǒng)它由哪些類型的成員,各占用多少字節(jié),各按什么形式存儲(chǔ),并把它作為一個(gè)整體來處理,同時(shí)只定義類型是不分配內(nèi)存單元的。
4)系統(tǒng)沒有預(yù)先定義結(jié)構(gòu)體類型,凡需使用結(jié)構(gòu)體類型數(shù)據(jù)的,都必須在程序中自己定義。
3.2 結(jié)構(gòu)體類型變量的定義
1) 在定義了結(jié)構(gòu)體類型之后,把變量定義為該類型;
如:struct person student,worker;
2)在定義一個(gè)結(jié)構(gòu)體類型的同時(shí)定義一個(gè)或若干個(gè)結(jié)構(gòu)體類型變量;
struct 結(jié)構(gòu)體名{
成員表列;
}變量名表列;
如:struct person{
} student,worker;
3)直接定義結(jié)構(gòu)體類型變量;
如:struct{
}student,worker;
注意:此方式無法定義其他結(jié)構(gòu)體類型變量;
3.3 結(jié)構(gòu)體類型變量的初始化及引用
在初始化時(shí),按照定義的結(jié)構(gòu)體類型的數(shù)據(jù)結(jié)構(gòu),依次寫出各初始值,依次寫出各初值。
struct person student={“Wang Li”,18,'M'};
引用方法:結(jié)構(gòu)體變量.成員名
如:student.name
注意:C語言不允許把一個(gè)結(jié)構(gòu)體作為一個(gè)整體進(jìn)行輸入與輸出。
3.4 結(jié)構(gòu)體與數(shù)組區(qū)別
數(shù)組只能按序組織多個(gè)同類型的數(shù)據(jù),結(jié)構(gòu)體可以組織多個(gè)不同類型的數(shù)據(jù)。
?
四、共用類型
共用體數(shù)據(jù)類型是指將不同的數(shù)據(jù)項(xiàng)存放于同一段內(nèi)存單元的一種構(gòu)造數(shù)據(jù)類型。
定義格式:
union 共用體名{
成員表列;
}變量表項(xiàng);
共用體類型很相似,與結(jié)構(gòu)體類型區(qū)別是共用體變量中的各個(gè)成員共用內(nèi)存中同一段變量空間。
注意:一個(gè)共用體變量不能同時(shí)存放多個(gè)成員變量的值,而只能存放其中一個(gè)值,這就是最后賦予它的值。
#include <QCoreApplication> //#include "test.h" #define f(x) x*x #define g(x) (x)*(x) #define h(x) ((x)*(x)) union exam{int a;float b;char c; } x;int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);union exam *pt;pt = &x;x.a = 8;x.b = 7.5;x.c = 'A';pt->a = 8;pt->b = 7.5;pt->c = 'A';qDebug("%d,%.2f,%c",x.a,x.b,x.c);qDebug("%d,%.2f,%c",pt->a,pt->b,pt->c);qDebug("%d,%d",sizeof(int),sizeof(float));return a.exec(); } 輸出結(jié)果是: 1089470529,7.50,A 1089470529,7.50,A 4,4? union結(jié)構(gòu)體內(nèi)存情況:
?—— —— —— —— a
?—— —— —— —— b
——? ? ? ? ? ? ? ? ? ? ? ? ? c
五、枚舉類型
枚舉類型,是指這種類型的變量的值只能是指定的若干個(gè)名字之一。
#include <QCoreApplication>enum color_name{red,yellow,blue,white,black };int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);enum color_name color;color = black;qDebug("%d",color);return a.exec(); }輸出結(jié)果是: 41) enum是關(guān)鍵字,標(biāo)識(shí)枚舉類型,定義枚舉類型必須用enum開頭;
2)在定義枚舉類型時(shí),花括號(hào)中一些名字是程序設(shè)計(jì)者自己定義,命名規(guī)則與標(biāo)識(shí)符相同;
3)它的值是一些整數(shù),如果沒有特殊定義,系統(tǒng)會(huì)自動(dòng)默認(rèn)從0開始,0,1,2,3...
4)可以在定義類型時(shí)對(duì)枚舉變量進(jìn)行初始化
enum color_name{red = 3,yellow,blue,white = 8,black };5)枚舉常量可以進(jìn)行比較
if (color == red)qDebug("red");6) 一個(gè)枚舉變量的值只能是定義的幾個(gè)枚舉常量之一,可以將枚舉常量賦給枚舉變量;
color = red;(正確) color = 0;(錯(cuò)誤)7) 枚舉常量不是字符串,不能用下面方法輸出字符串“red”;
qDebug("%s",red);可通過
qDebug("red");?
六、文件類型
詳見《深入淺出之文件》
總結(jié)