2017-04-10 58 views
0

我目前正在通過K & R學習C.作者提出了一個重要的區別,即指針和數組的行爲相似,但它們不同,因爲指針是一個變量,可以指向不同的東西而陣列沒有這個能力。數組和指針不同

我明白這一點,但下面的代碼混淆了我一點點:

int len, nlines; 
char *p, line[MAXLINES]; /* Confusing part */ 

我知道,當你傳遞一個數組給它衰變爲指針的功能,但在這裏,你可以聲明一個字符指針和字符數組在同一行,即使它們不同?也許我很迷惑自己,但這對我來說很奇怪。謝謝!

+3

您可以在同一行聲明多個事情,如果他們都具有相同的「根」類型,例如'int w,x,y [5],z(void);'聲明兩個int,一個int數組和一個返回int的函數。有些人不鼓勵這種做法,每個聲明更喜歡一個標識符。 –

+0

p是一個指向char的指針。行是char的MAXLINES大小的數組。 –

+0

這裏令人困惑的是變量可以'修改'根類型。因此'char a,* b,** c'將會聲明一個單獨的字符'a',一個指向字符'b'的指針以及一個指向字符'c'的指針。類似地,當用於類似的聲明風格時,數組'修改'根類型。因此,這就是爲什麼我見過的大多數現代C開發人員推薦在[tadman的回答](http://stackoverflow.com/a/43334568/510036)中描述的聲明風格,而不是在單個聲明行上。 – Qix

回答

3

這只是宣佈在同一行多個變量和等效於此:

char *p; // Pointer 
char line[MAXLINES]; // Fixed-sized character array 

他們不是在比他們的基本類型以外的任何方式有關,他們在源代碼中被宣佈。

0

從我記得,其實並沒有讓人困惑。如果您查看該行,代碼中的,分隔爲*plines[MAXLINES]。因此,用戶聲明瞭兩個不同的變量。

你可以看一下這個喜歡:

char *p; //Pointer due to the asterik (*) 
char line[MAXLINES]; //Array because of [] 

同樣的事情會在int len, nlines;

int len; //First int var 
int nlines; //Second int var 

我們只在一行上寫var以使它看起來乾淨。除此之外,兩者沒有區別。

-3

他們是一切事物的相同 你可以聲明一個指針,並把它作爲數組

int *ptr,arr[10],value=5; 
ptr[0]=value; 
*(arr)=value; 

,但不同的是數組常量指針

+2

這是錯誤的,一個指針不是一個數組,'ptr'指向無,'value'沒有被初始化。你調用未定義的行爲。 – mch

+0

哦,請知道它沒有初始化假設它是任何數字 –

+0

'ptr'仍然未初始化,所以'ptr [0]'調用未定義的行爲。數組和指針也不是「一切都一樣」,數組也不是常量指針。 – mch