2011-04-04 50 views
2

可能重複:
In C, why is the asterisk before the variable name, rather than after the type?
What's your preferred pointer declaration style, and why?*或&事項的位置?

在C++中,我看到指針放在不同的方式。例如,

char* ptr 
char * ptr 
char *ptr 

以上3個例子是否相同? (&也一樣)

+3

另見:[this question](http://stackoverflow.com/questions/398395/in-c-why-is-the-asterisk-before-the-variable-name-rather-than-after-the - 類型),[這個問題](http://stackoverflow.com/questions/558474/what-makes-more-sense-char-string-or-char-string),[這個問題](http:// stackoverflow .com/questions/2660633/declaring-pointers-asterisk-the-the-left-or-right-of-the-space-between-the-type-a)和[this question](http://stackoverflow.com)/questions/377164/whats-your-preferred-pointer-declaration-style-and-why) – eldarerathis 2011-04-04 21:28:34

+0

句法和美學糖! – 2011-04-04 21:41:13

回答

5

沒關係。 (例如,它們是相同的。)甚至可以在沒有任何空白的情況下寫入char*ptr;
儘管在一行上有多個聲明:char* ptr, noptr;。這裏,第三種語法更清晰:char *ptr, noptr;
我的規則,以避免混淆:每行只有一個變量。另一種方法把事情做對沒有可能錯過一個*typedef指針,例如:

typedef char* CharPtr; 
CharPtr ptr1, ptr2; // now both are pointer 

雖然那麼你需要知道的其它事情,比如const湖,所以我堅持到上面提到的我的規則:

typedef char* CharPtr; 
const CharPtr p1; // const char* ?? or char* const ?? 
CharPtr const p2; // char* const ?? or const char* ?? 
// Eg.: Can't the pointer or the pointee be changed? 

(以及上述所有的也適用於引用&。)

+0

嘿是的第三個是更清晰.. great thnx :) – andrew 2011-04-04 21:29:59

+0

對於'typedef char * CharPtr +1'' – Mahesh 2011-04-04 21:39:14

2

沒關係。然而,C++人傾向於更喜歡char* ptr,而C人更喜歡char *ptr。這都是個人喜好的問題。

但是,請注意char* ptr, noptrptr聲明爲指針,將noptr聲明爲char值。

+3

這很主觀,我更喜歡'char * ptr'。 – Xeo 2011-04-04 21:24:59

+4

儘管......'char * a,b;' – geofftnz 2011-04-04 21:25:56

+0

@Xeo,這當然也是個人喜好的問題,但是我所討論過的大多數人更喜歡這種方式。 – 2011-04-04 21:26:49

0

聲明中圍繞*&修飾符的潛在空白對編譯代碼沒有影響。

+0

grrr ... thnx..stupid東西讓我煩擾 – andrew 2011-04-04 21:26:06

0

C++是自由格式語言。所以,在這種情況下,空間並不算真正的意義,所有的意思都是一樣的。

+0

是的。我喜歡用無(額外)空白區域編寫我的代碼。或者任何空白區域都應該是「\ n」。兩者都使它讀起來很有趣。 – 2011-04-04 21:43:26

4

C人傾向於喜歡char *p,而C++人傾向於喜歡char* p(至少Bjarne)。編譯器不關心空白,你可以說char * pchar*p

很多人說char* p是危險的,因爲char* p, q可能會令人困惑。原則上這是正確的,但是:

  1. 爲了增加可讀性,您不應該在一次聲明中聲明多個名稱。

  2. 更重要的是,在C++中,您通常應該比RAI類型優先於原始指針。

2

他們都工作。char *ptr經常提倡,因爲它使得它更清楚什麼是在這種情況下發生:

char *ptr, var;

聲明一個字符指針和一個char。

3

C++人強調類型,而C人強調使用。

所以你在C++中看到char* x,這是因爲「x的類型是指向字符的指針」。 C++有一個強大的語言所依賴的類型系統。這是而不是 C中的情況。

在C中,您根據您想要對它們執行的操作聲明變量。當你在C中看到char *x時,思考過程是「當你取消引用x時,你會得到一個字符」。又如:

char (*f)(int); 

寫着「當你提領f,並用INT調用它,你就會得到一個char」,即。 f是一個指向一個函數的指針,它接受int並返回char。