介紹
曾經碰到過讓你迷惑不解、類似於int * (* (*fp1) (int) ) [10];這樣的變量聲明嗎?本文將由易到難,一步一步教會你如何理解這種復雜的C/C++聲明:我們將從每天都能碰到的較簡單的聲明入手,然後逐步加入const修飾符和typedef,還有函數指針,最後介紹一個能夠讓你准確地理解任何C/C++聲明的“右左法則”。需要強調一下的是,復雜的C/C++聲明並不是好的編程風格;我這裡僅僅是教你如何去理解這些聲明。注意:為了保證能夠在同一行上顯示代碼和相關注釋,本文最好在至少1024x768分辨率的顯示器上閱讀。
基礎
讓我們從一個非常簡單的例子開始,如下:
int n;
這個應該被理解為“declare n as an int”(n是一個int型的變量)。
接下去來看一下指針變量,如下:
int *p;
這個應該被理解為“declare p as an int *”(p是一個int *型的變量),或者說p是一個指向一個int型變量的指針。我想在這裡展開討論一下:我覺得在聲明一個指針(或引用)類型的變量時,最好將*(或&)寫在緊靠變量之前,而不是緊跟基本類型之後。這樣可以避免一些理解上的誤區,比如:
int* p,q;
第一眼看去,好像是p和q都是int*類型的,但事實上,只有p是一個指針,而q是一個最簡單的int型變量。
我們還是繼續我們前面的話題,再來看一個指針的指針的例子:
char **argv;
理論上,對於指針的級數沒有限制,你可以定義一個浮點類型變量的指針的指針的指針的指針...
再來看如下的聲明:
int RollNum[30][4];
int (*p)[4]=RollNum;
int *q[5];
這裡,p被聲明為一個指向一個4元素(int類型)數組的指針,而q被聲明為一個包含5個元素(int類型的指針)的數組。
另外,我們還可以在同一個聲明中混合實用*和&,如下:
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是一個int類型的指針的指針;p2是一個int類型的指針的引用;p3是一個int類型引用的指針(不合法!);p4是一個int類型引用的引用(不合法!)。