當(dāng)前位置:首頁(yè) > IT技術(shù) > 編程語(yǔ)言 > 正文

C/C++常識(shí)之?dāng)?shù)據(jù)類(lèi)型
2021-10-28 15:20:24

基本數(shù)據(jù)類(lèi)型

整型int,long,字符型char,浮點(diǎn)型float、double,常用的基本數(shù)據(jù)類(lèi)型就這些。

結(jié)構(gòu)體

結(jié)構(gòu)體可以理解為開(kāi)發(fā)者用已有的數(shù)據(jù)類(lèi)型為原料組合成的數(shù)據(jù)類(lèi)型。例如數(shù)組就是這樣的類(lèi)型,數(shù)組其實(shí)就是我們開(kāi)發(fā)者自己定義的一個(gè)數(shù)據(jù)類(lèi)型,由多個(gè)相同數(shù)據(jù)類(lèi)型的變量組合而所得,例如:

int a[maxSize];

上面這句話(huà)相當(dāng)于把maxSize個(gè)int型變量擺在一起,其中各個(gè)int型變量之間的關(guān)系由數(shù)組的下標(biāo)反映。

試想,如果我們想要定義這樣的數(shù)組,這個(gè)數(shù)組里面第一個(gè)變量是整形的,第二個(gè)變量是字符型的,第三個(gè)變量是浮點(diǎn)型的,此時(shí)就需要用到結(jié)構(gòu)體。

結(jié)構(gòu)體是系統(tǒng)提供給程序員制作新數(shù)據(jù)類(lèi)型的一種機(jī)制,即可以用系統(tǒng)已有的不同的基本數(shù)據(jù)類(lèi)型或用戶(hù)定義的結(jié)構(gòu)型,組合成用戶(hù)需要的復(fù)雜數(shù)據(jù)類(lèi)型。

剛剛提到的那個(gè)“奇怪的數(shù)組”,可以用結(jié)構(gòu)體實(shí)現(xiàn)如下:

typedef struct
{
    int a;
    char b;
    float c;
} MyType;

現(xiàn)有語(yǔ)句如下:

MyType a[3];

思考一下,上面這句話(huà)是什么意思呢?

顯然,上面這句話(huà)定義了一個(gè)數(shù)組,這個(gè)數(shù)組由3個(gè)MyType類(lèi)型的元素組成。

因?yàn)榍懊嬉呀?jīng)定義好了MyType類(lèi)型的數(shù)據(jù)結(jié)構(gòu),MyType其實(shí)含有3個(gè)分量。

因此其實(shí)你可以把a(bǔ)類(lèi)比為一個(gè)二維數(shù)組。

就好像下面這句話(huà):

int b[3][3];

上面這句話(huà)定義了一個(gè)名字為b的二維數(shù)組,二維數(shù)組可以看成一個(gè)一維數(shù)組,其數(shù)組元素也是一個(gè)一維數(shù)組。

b中取第一個(gè)元素的第一個(gè)分量:

b[0][0]

a中取第一個(gè)元素的第一個(gè)分量:

a[0].a

指針

變量里面裝的是數(shù)據(jù)元素的內(nèi)容。

指針里面裝的是變量的地址。

通過(guò)指針可以找出變量在內(nèi)存中的位置。

指針對(duì)于每種數(shù)據(jù)類(lèi)型都有特定的定義方法,有專(zhuān)門(mén)指向int的指針,也有專(zhuān)門(mén)指向float的指針...

對(duì)于每種變量,其指針的定義規(guī)則類(lèi)似:

int *a ;
char *b ;
float *c ;
MyType *d ;

上面這段話(huà)表示:指向整形變量的指針a,指向字符型變量的指針b...

指針變量的定義只是在變量名前面多了一個(gè)*號(hào)

如果a是一個(gè)指針型變量,且這個(gè)指針型變量已經(jīng)指向了一個(gè)變量b,則a中存放的就是變量b的地址

*a

上面這句話(huà)表示取變量a中的內(nèi)容,其實(shí)就相當(dāng)于b

&b

上面這句話(huà)表示取變量b的地址

a = &b ;

上面這句話(huà)表示,將變量b的地址存放于指針a中,也可以叫做指針a指向b

鏈表結(jié)點(diǎn)的構(gòu)造

鏈表結(jié)點(diǎn)有2個(gè)域,即數(shù)據(jù)域和指針域。數(shù)據(jù)域存放數(shù)據(jù),指針域存放下一個(gè)結(jié)點(diǎn)的位置

鏈表結(jié)點(diǎn)的結(jié)構(gòu)型定義為:

typedef struct Node
{
    int data ;
    struct Node *next;
}Node ;

上面這段話(huà)的含義,請(qǐng)仔細(xì)理解一下

首先結(jié)構(gòu)型的名字為Node

因?yàn)榻M成此結(jié)構(gòu)體的成員中有一個(gè)指向和自己類(lèi)型相同的變量的指針

并且內(nèi)部要用自己來(lái)定義這個(gè)指針,所以要寫(xiě)成:

struct Node *next;

凡是結(jié)構(gòu)體a內(nèi)部含義指針b

并且b是用來(lái)存放和a類(lèi)型相同的結(jié)構(gòu)體變量地址的指針類(lèi)型(比如說(shuō)鏈表的應(yīng)用場(chǎng)景,鏈表中結(jié)點(diǎn)的指針域指向的也是結(jié)點(diǎn)變量)

則在定義結(jié)構(gòu)體時(shí),a的typedef struct語(yǔ)句之后要加上a這個(gè)結(jié)構(gòu)體的名字,比如上面的Node

從語(yǔ)法上來(lái)說(shuō),這里的兩個(gè)Node可以是不一樣的,編譯器也不會(huì)報(bào)錯(cuò),但是從程序的可讀性而言,最好這兩處的名稱(chēng)是一樣的

C/C++常識(shí)之?dāng)?shù)據(jù)類(lèi)型_結(jié)點(diǎn)

二叉樹(shù)結(jié)點(diǎn)的構(gòu)造

二叉樹(shù)的結(jié)點(diǎn)其實(shí)和鏈表的結(jié)點(diǎn)差不多,直接看代碼:

typedef stuct BTNode
{
    int data ;
    struct BTNode *lchid;
    struct BTNode *rchild;
}BTNode;

代碼不難理解,和剛剛鏈表結(jié)點(diǎn)的構(gòu)造差不多

當(dāng)然如果要寫(xiě)得復(fù)雜點(diǎn),還可以這樣寫(xiě):

typedef stuct BTNode
{
    int data ;
    struct BTNode *lchid;
    struct BTNode *rchild;
}BTNode,*btnode;

可以發(fā)現(xiàn),后面多寫(xiě)了個(gè)*btnode,為什么要這樣寫(xiě)呢?

考慮我們要定義一個(gè)結(jié)點(diǎn)指針p

如果用第一種定義方法(比較簡(jiǎn)單的那個(gè)),我們需要這樣寫(xiě):

BTNode *p ;

如果你用第二種定義方法(比較復(fù)雜的那個(gè),后面加了點(diǎn)東西)。我們可以這樣寫(xiě):

btnode p ;

兩種方法各有利弊:

簡(jiǎn)單的方法利于理解,但是你定義結(jié)點(diǎn)的時(shí)候需要多寫(xiě)一點(diǎn),不容易搞混

復(fù)雜的方法寫(xiě)的時(shí)候復(fù)雜,但是定義的時(shí)候可以少寫(xiě)一點(diǎn),容易搞混

下面介紹制作新結(jié)點(diǎn)的方法:

第一種方法這么寫(xiě)

BTNode BT ;

訪(fǎng)問(wèn)的時(shí)候這樣寫(xiě)(結(jié)構(gòu)體變量直接取其分量)

x = BT.data ;

該方法只用一句話(huà)就制作了一個(gè)結(jié)點(diǎn)

但是我們一般不會(huì)這么寫(xiě),而采用如下方法

第二種方法這么寫(xiě)

BTNode *BT ;
BT = (BtNode*)malloc(sizeof(BTNode));

首先定義一個(gè)節(jié)點(diǎn)的額指針BT

然后使用函數(shù)malloc申請(qǐng)一個(gè)結(jié)點(diǎn)的內(nèi)存空間

最后讓BT指向這片內(nèi)存空間

其中malloc函數(shù)是系統(tǒng)提供的內(nèi)存分配函數(shù)

C/C++常識(shí)之?dāng)?shù)據(jù)類(lèi)型_數(shù)組_02

當(dāng)然BT可以離開(kāi)這個(gè)結(jié)點(diǎn)而轉(zhuǎn)向其他結(jié)點(diǎn),所以說(shuō)第二種方法比較靈活

訪(fǎng)問(wèn)的時(shí)候這樣寫(xiě)(指向結(jié)構(gòu)體變量的指針取結(jié)構(gòu)體的分量)

x = BT -> data ;

當(dāng)然你也可以這樣寫(xiě)

x = (*BT).data ;

動(dòng)態(tài)申請(qǐng)數(shù)組空間

剛剛是一次只申請(qǐng)一個(gè)結(jié)點(diǎn),其實(shí)還有一次申請(qǐng)一組結(jié)點(diǎn)的方法

假設(shè)申請(qǐng)一個(gè)數(shù)組,數(shù)組內(nèi)的元素類(lèi)型為int型,長(zhǎng)度為n,當(dāng)然了,此處的int可以換成任意的數(shù)據(jù)類(lèi)型,包括你自己定義的結(jié)構(gòu)體類(lèi)型

int *p ;
p = (int *)malloc(n * sizeof(int)) ;

上述語(yǔ)句申請(qǐng)了一個(gè),由p指向的,元素為int類(lèi)型的,長(zhǎng)度為n的動(dòng)態(tài)數(shù)組

當(dāng)然p指向的是數(shù)組中第一個(gè)元素的地址

取元素的時(shí)候,和一般的靜態(tài)數(shù)組都是一樣的

對(duì)比

對(duì)比制作結(jié)點(diǎn)的第二種方法和動(dòng)態(tài)申請(qǐng)數(shù)組空間的方法,其不同之處僅僅在于,sizeof運(yùn)算符前要乘以n

請(qǐng)注意sizeof是運(yùn)算符,不是函數(shù)

typedef

typedef就是給現(xiàn)有的數(shù)據(jù)類(lèi)型起一個(gè)別名

比如typedef struct{...} TypeA

就是給struct{...}取一個(gè)別名TypeA

# define

給常量取個(gè)別名

給0、1取ERROR、OK以及maxSize等常數(shù)的別名上用的比較多

?

本文摘自 :https://blog.51cto.com/u

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >