初學(xué)者必備:教你理解復(fù)雜的C/C++聲明

字號(hào):

曾經(jīng)碰到過(guò)讓你迷惑不解、類(lèi)似于int * (* (*fp1) (int) ) [10];這樣的變量聲明嗎?本文將由易到難,一步一步教會(huì)你如何理解這種復(fù)雜的C/C++聲明。我們將從每天都能碰到的較簡(jiǎn)單的聲明入手,然后逐步加入const修飾符和typedef,還有函數(shù)指針,最后介紹一個(gè)能夠讓你準(zhǔn)確地理解任何C/C++聲明的“右左法則”。需要強(qiáng)調(diào)一下的是,復(fù)雜的C/C++聲明并不是好的編程風(fēng)格;這里僅僅是教你如何去理解這些聲明。
    讓我們從一個(gè)非常簡(jiǎn)單的例子開(kāi)始,如下:
    int n;
    這個(gè)應(yīng)該被理解為“declare n as an int”(n是一個(gè)int型的變量)。接下去來(lái)看一下指針變量,如下:
    int *p;
    這個(gè)應(yīng)該被理解為“declare p as an int *”(p是一個(gè)int *型的變量),或者說(shuō)p是一個(gè)指向一個(gè)int型變量的指針。我想在這里展開(kāi)討論一下:我覺(jué)得在聲明一個(gè)指針(或引用)類(lèi)型的變量時(shí),將*(或&)寫(xiě)在緊靠變量之前,而不是緊跟基本類(lèi)型之后。這樣可以避免一些理解上的誤區(qū),比如:
    int* p,q;
    第一眼看去,好像是p和q都是int*類(lèi)型的,但事實(shí)上,只有p是一個(gè)指針,而q是一個(gè)最簡(jiǎn)單的int型變量。我們還是繼續(xù)我們前面的話題,再來(lái)看一個(gè)指針的指針的例子:
    char **argv;
    理論上,對(duì)于指針的級(jí)數(shù)沒(méi)有限制,你可以定義一個(gè)浮點(diǎn)類(lèi)型變量的指針的指針的指針的指針,再來(lái)看如下的聲明:
    int RollNum[30][4];
     int (*p)[4]=RollNum;
     int *q[5];
    這里,p被聲明為一個(gè)指向一個(gè)4元素(int類(lèi)型)數(shù)組的指針,而q被聲明為一個(gè)包含5個(gè)元素(int類(lèi)型的指針)的數(shù)組。另外,我們還可以在同一個(gè)聲明中混合實(shí)用*和&,如下:
    int **p1;
     // p1 is a pointer to a pointer to an int.
     int *&p2;
     // p2 is a reference to a pointer to an int.
     int &*p3;
     // ERROR: Pointer to a reference is illegal.
     int &&p4;
     // ERROR: Reference to a reference is illegal.
    注:p1是一個(gè)int類(lèi)型的指針的指針;p2是一個(gè)int類(lèi)型的指針的引用;p3是一個(gè)int類(lèi)型引用的指針(不合法?。?;p4是一個(gè)int類(lèi)型引用的引用(不合法?。?BR>    const修飾符
    當(dāng)你想阻止一個(gè)變量被改變,可能會(huì)用到const關(guān)鍵字。在你給一個(gè)變量加上const修飾符的同時(shí),通常需要對(duì)它進(jìn)行初始化,因?yàn)橐院蟮娜魏螘r(shí)候你將沒(méi)有機(jī)會(huì)再去改變它。例如:
    const int n=5;
     int const m=10;
    上述兩個(gè)變量n和m其實(shí)是同一種類(lèi)型的——都是const int(整形恒量)。因?yàn)镃++標(biāo)準(zhǔn)規(guī)定,const關(guān)鍵字放在類(lèi)型或變量名之前等價(jià)的。我個(gè)人更喜歡第一種聲明方式,因?yàn)樗怀隽薱onst修飾符的作用。當(dāng)const與指針一起使用時(shí),容易讓人感到迷惑。例如,我們來(lái)看一下下面的p和q的聲明:
    const int *p;
     int const *q;
    他們當(dāng)中哪一個(gè)代表const int類(lèi)型的指針(const直接修飾int),哪一個(gè)代表int類(lèi)型的const指針(const直接修飾指針)?實(shí)際上,p和q都被聲明為const int類(lèi)型的指針。而int類(lèi)型的const指針應(yīng)該這樣聲明:
    int * const r= &n;
     // n has been declared as an int
    這里,p和q都是指向const int類(lèi)型的指針,也就是說(shuō),你在以后的程序里不能改變*p的值。而r是一個(gè)const指針,它在聲明的時(shí)候被初始化指向變量n(即r=&n;)之后,r的值將不再允許被改變(但*r的值可以改變)。