復合類型的聲明——是int *p還是int* p
我們先來看一條基本類型的聲明語句:int a, b, ...
即一條聲明語句由一個數據類型(int)和緊隨其後的一個變量名列表(a, b, ...)組成
更通用的描述是:一個基本數據類型和緊隨其後的一個聲明符列表組成,每個聲明符命名了一個變量並指定該變量是與該基本數據類型有關的某種類型。
例如:上面的聲明語句中,聲明符其實就是變量名,變量的類型也就是聲明的基本數據類型。這只說明這個聲明符是簡單的,我們下面介紹更復雜的聲明符,它基於基本數據類型得到更復雜的類型(如指針、引用等),並把它指定給變量。
我們來看這麽一條定義語句:int i = 10, *p = &i, &r = i;
上面這條定義語句中包含類型修飾符“*”、“&”,我們往往迷惑於基本數據類型和類型修飾符的關系,但必須要知道的是類型修飾符只是聲明符的一部分罷了。
再來看這麽一條聲明語句:int *p1, *p2;
我們往往稱“*”為類型修飾符,而將“p1”稱為變量標識符,聲明符就是類型修飾符和變量標識符的組合“*p1”。
這種形式著重強調變量具有復合類型。
還有一種聲明的方法:int* p1, p2;
我們本打算定義兩個指針變量p1和p2,但結果卻是只定義了一個指針變量p1,變量p2則是int型變量。
之所以會產生這樣的錯誤,是因為我們誤以為類型修飾符“*”作用於本次定義的全部變量,int*放在一起好像是這條聲明語句中所有變量共同的類型一樣。其實,基本數據類型是int而非int*,“*”僅僅是修飾了p1而已,對該聲明語句中的其他變量並不產生任何作用。
如果我們硬是要讓基本數據類型和類型修飾符放在一起,可以每條聲明語句只定義一個變量:
int* p1; int* p2;
這種形式著重強調本次聲明定義了一種復合類型。
【補充】
這樣的聲明語句等價於上面的聲明語句:int* p1, *p2; //不覺得難看??
結論:題目中的兩種方法都可以,但推薦使用聲明符的方法!
復合類型的聲明——是int *p還是int* p