教你理解復(fù)雜的C/C++聲明

字號(hào):

原文:
    http://www.codeproject.com/cpp/complex_declarations.asp
    作者:Vikram A Punathambekar
    介紹
    曾經(jīng)碰到過(guò)讓你迷惑不解、類似于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)格;我這里僅僅是教你如何去理解這些聲明。注意:為了保證能夠在同一行上顯示代碼和相關(guān)注釋,本文在至少1024x768分辨率的顯示器上閱讀。 來(lái)源:www.examda.com
    基礎(chǔ)
    讓我們從一個(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è)指針(或引用)類型的變量時(shí),將*(或&)寫(xiě)在緊靠變量之前,而不是緊跟基本類型之后。這樣可以避免一些理解上的誤區(qū),比如:
    int* p,q;
    第一眼看去,好像是p和q都是int*類型的,但事實(shí)上,只有p是一個(gè)指針,而q是一個(gè)最簡(jiǎn)單的int型變量。
    我們還是繼續(xù)我們前面的話題,再來(lái)看一個(gè)指針的指針的例子:
    char **argv;
    理論上,對(duì)于指針的級(jí)數(shù)沒(méi)有限制,你可以定義一個(gè)浮點(diǎn)類型變量的指針的指針的指針的指針...
    再來(lái)看如下的聲明:
    int RollNum[30][4];
    int (*p)[4]=RollNum;
    int *q[5];
    這里,p被聲明為一個(gè)指向一個(gè)4元素(int類型)數(shù)組的指針,而q被聲明為一個(gè)包含5個(gè)元素(int類型的指針)的數(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類型的指針的指針;p2是一個(gè)int類型的指針的引用;p3是一個(gè)int類型引用的指針(不合法?。?;p4是一個(gè)int類型引用的引用(不合法?。?