C/C++中構(gòu)造通用的對(duì)象鏈表
發(fā)布時(shí)間:2008/9/12 0:00:00 訪問(wèn)次數(shù):467
復(fù)雜的c/c++聲明并不是好的編程風(fēng)格;這里僅僅是教你如何去理解這些聲明。注意:為了保證能夠在同一行上顯示代碼和相關(guān)注釋,本文最好在至少1024x768分辨率的顯示器上閱讀。鏈表的難點(diǎn)在于必須復(fù)制鏈表處理函數(shù)來(lái)處理不同的對(duì)象,即便邏輯是完全相同的。
基礎(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類型引用的指針(不合法。籶4是一個(gè)int類型引用的引用(不合法。。
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í)是同一種類型的--都是const int(整形恒量)。因?yàn)閏++標(biāo)準(zhǔn)規(guī)定,const關(guān)鍵字放在類型或變量名之前等價(jià)的。我個(gè)人更喜歡第一種聲明方式,因?yàn)樗怀隽薱onst修飾符的作用。
當(dāng)const與指針一起使用時(shí),容易讓人感到迷惑。例如,我們來(lái)看一下下面的p和q的聲明:
const int *p;
int const *q;
他們當(dāng)中哪一個(gè)代表const int類型的指針(const直接修飾int),哪一個(gè)代表int類型的const指針(const直接修飾指針)?實(shí)際上,p和q都被聲明為const int類型的指針。而int類型的const指針應(yīng)該這樣聲明:
int * const r= &n; // n has been declared as an int
這里,p和q都是指向const int類型的指針,也就是說(shuō),你在以后的程序里不能改變*p的值。而r是一個(gè)const指針,它在聲明的時(shí)候被初始化指向變量n(即r=&n;)之后,r的值將不再允許被改變(但*r的值可以改變)。
組合上述兩種const修飾的情況,我們來(lái)聲明一個(gè)指向const int類型的const指針,如下:
const int * const p=&n // n has been declared as const int
下面給出的一些關(guān)于const的聲明,將幫助你徹底理清const的用法。不過(guò)請(qǐng)注意,下面的一些聲明是不能被編譯通過(guò)的,因?yàn)樗麄冃枰诼暶鞯耐瑫r(shí)進(jìn)行初始化。為了簡(jiǎn)潔起見(jiàn),我忽略了初始化部分;因?yàn)榧尤氤跏蓟a的話,下面每個(gè)聲明都將增加兩行代碼。
char ** p1; // pointer to pointer to char
const char **p2; // pointer to pointer to const char
char * const * p3; // pointer to const pointer to char
const char * const * p4; // pointer to const pointer to const char
char ** const p5; // const pointer to pointer to char
const char ** const p6; // const pointer to pointer to const char
char * const * const p7; // const pointer to const pointer to char
const char * const * const p8; // const pointer to const pointer to const char
注:p1是指向char類型的指針的指針;p2是指向const char類型的指針的指針;p3是指向char類型的const指針;p4是指向const ch
復(fù)雜的c/c++聲明并不是好的編程風(fēng)格;這里僅僅是教你如何去理解這些聲明。注意:為了保證能夠在同一行上顯示代碼和相關(guān)注釋,本文最好在至少1024x768分辨率的顯示器上閱讀。鏈表的難點(diǎn)在于必須復(fù)制鏈表處理函數(shù)來(lái)處理不同的對(duì)象,即便邏輯是完全相同的。
基礎(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類型引用的引用(不合法!)。
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í)是同一種類型的--都是const int(整形恒量)。因?yàn)閏++標(biāo)準(zhǔn)規(guī)定,const關(guān)鍵字放在類型或變量名之前等價(jià)的。我個(gè)人更喜歡第一種聲明方式,因?yàn)樗怀隽薱onst修飾符的作用。
當(dāng)const與指針一起使用時(shí),容易讓人感到迷惑。例如,我們來(lái)看一下下面的p和q的聲明:
const int *p;
int const *q;
他們當(dāng)中哪一個(gè)代表const int類型的指針(const直接修飾int),哪一個(gè)代表int類型的const指針(const直接修飾指針)?實(shí)際上,p和q都被聲明為const int類型的指針。而int類型的const指針應(yīng)該這樣聲明:
int * const r= &n; // n has been declared as an int
這里,p和q都是指向const int類型的指針,也就是說(shuō),你在以后的程序里不能改變*p的值。而r是一個(gè)const指針,它在聲明的時(shí)候被初始化指向變量n(即r=&n;)之后,r的值將不再允許被改變(但*r的值可以改變)。
組合上述兩種const修飾的情況,我們來(lái)聲明一個(gè)指向const int類型的const指針,如下:
const int * const p=&n // n has been declared as const int
下面給出的一些關(guān)于const的聲明,將幫助你徹底理清const的用法。不過(guò)請(qǐng)注意,下面的一些聲明是不能被編譯通過(guò)的,因?yàn)樗麄冃枰诼暶鞯耐瑫r(shí)進(jìn)行初始化。為了簡(jiǎn)潔起見(jiàn),我忽略了初始化部分;因?yàn)榧尤氤跏蓟a的話,下面每個(gè)聲明都將增加兩行代碼。
char ** p1; // pointer to pointer to char
const char **p2; // pointer to pointer to const char
char * const * p3; // pointer to const pointer to char
const char * const * p4; // pointer to const pointer to const char
char ** const p5; // const pointer to pointer to char
const char ** const p6; // const pointer to pointer to const char
char * const * const p7; // const pointer to const pointer to char
const char * const * const p8; // const pointer to const pointer to const char
注:p1是指向char類型的指針的指針;p2是指向const char類型的指針的指針;p3是指向char類型的const指針;p4是指向const ch
熱門點(diǎn)擊
- 基于FPGA內(nèi)部的FIFO設(shè)計(jì)
- 可編程邏輯器件PLA乘積項(xiàng)陣列
- SmartXplorer技術(shù)
- XMD軟件的調(diào)試設(shè)計(jì)
- 什么是C語(yǔ)言中的寬字符與多字節(jié)字符
- EDK簡(jiǎn)介
- 全局時(shí)鐘緩沖器(BUFG)和第2全局時(shí)鐘資源
- 使用FPGA底層編輯器一
- ISE 10.1提供其他Tcl命令
- EDK工具自定義IP核
推薦技術(shù)資料
- 聲道前級(jí)設(shè)計(jì)特點(diǎn)
- 與通常的Hi-Fi前級(jí)不同,EP9307-CRZ這臺(tái)分... [詳細(xì)]
- 扇出型面板級(jí)封裝(FOPLP)
- 全球首款無(wú)掩模光刻系統(tǒng)—DSP
- 紫光閃存E5200 PCIe 5.0 企業(yè)級(jí)
- NAND Flash 技術(shù)和系
- 高性能DIMM 內(nèi)存數(shù)據(jù)技術(shù)封
- PCIe Gen4 SSD主控
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究