2010-04-18 165 views
80

可能重複:
What makes more sense - char* string or char *string? Pointer declarations in C++: placement of the asterisk
聲明指針;星號在類型和名稱之間的空白左側或右側?

我見過的這個混合版本中大量的代碼。 (順便說一句,這適用於C和C++)。人們似乎用兩種方式之一來聲明指針,而我不知道哪一個是正確的,哪怕它很重要。

它把星號相鄰的類型名稱,像這樣的第一種方式:

someType* somePtr; 

的第二種方式是把星號相鄰的名稱的變量,像這樣:

someType *somePtr; 

這已經讓我堅持了一段時間了。有沒有任何標準的方法來聲明指針?它甚至不重要的是如何聲明指針?我之前使用過這兩個聲明,而且我知道編譯器不關心它是哪種方式。但是,我看過指針以兩種不同的方式聲明的事實讓我相信它背後有一個原因。我很好奇,如果任何一種方法更具可讀性或邏輯性,我就會失去某種方式。

+0

美是內在的,外在的。美化代碼執行。 – 2010-04-18 00:49:04

+0

之前做過幾次。請參閱*最少* http://stackoverflow.com/questions/855566/pointer-syntax-variable-vs-variable-closed http://stackoverflow.com/questions/398395/in-c-why-is-the-星號之前的變量名稱,而不是之後的類型http://stackoverflow.com/questions/558474/what-makes-more-sense-char-string-or-char-string – dmckee 2010-04-18 00:52:07

+7

要可以肯定,這不是一個容易的話題來搜索... – dmckee 2010-04-18 00:52:41

回答

71

它喜好的問題,和聖戰有點的,就像括號風格。

樣式

someType* somePtr; 

被強調指針變量的類型。它基本上是這樣說的,「somePtr的類型是指向someType的指針」。

風格

someType *somePtr 

被強調指向的數據的類型。它實質上是說,「somePtr指向的數據類型是someType」。

它們都表示同樣的事情,但它取決於創建指針時給定程序員的心智模型是否「聚焦」,也就是說,指向數據或指針變量。

把它放在中間(如someType * somePtr)試圖避免承諾任何一個。

+9

我把一個空格圍繞'*',但它不是避免提交,我的重點絕對是類型,但是我把它看作是一個類型的修飾符,類似於我們不說'intconst'而是'int const'。 「const space const const * const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const const int const);?? – 2013-10-19 02:53:31

+19

我可以理解把你的理由放在雙方的空間上,但我會避免它,使整個事物看起來像我的乘法一樣 – 2014-10-17 15:04:47

+0

傳統上講,我們用'type name = val;'所以我們可以更簡潔地聲明'someType * somePtr'更準確地說,這個約定在'someType *'是類型[指針]和'somePtr'仍然是名字的地方。當我們將方括號放在類型一側(即'byte []')時,我們對數組做類似的操作。但說實話,如果你問我如何寫我的指針,我會說我現在仍然更喜歡把它們寫成'someType * somePtr' :)給他自己的每個... – rdev5 2015-04-21 19:31:01

43

沒關係,這是個人喜好。

有些人喜歡保持類型在一起:

int* p; 

其他人說,它下一步應該去的變量,因爲以下內容:

int *p, x;//declare 1 int pointer and 1 int 
int *p, *x;//declare 2 int pointers. 

隨着時間的推移,你會只是忽略這個並接受這兩種變化。

+0

是的,這是幫助我選擇'int * p'而不是'int * p'的情況。對我而言,這意味着星號與標識符有關係。 – 2017-11-11 19:53:47

-4

我見過的每一個方法是

TheType *myPointer 

,因爲您聲明型TheType的指針。類似聲明

TheType myVar 

將聲明一個類型爲TheType的實例變量。

你也可以那麼顯然做到這一點,有它容易閱讀

TheType myVar, *myPointer; 
+3

我也是這樣看過的;然而,我從來不喜歡通常重複的理由。在我看來,一個指針是一個_type_,所以它和_type_的其餘部分一樣,就像const修飾符一樣。輸入括號「(const char *)var」比「(const char *)var」更好的類型格式。此外,大部分解釋都在某個區域或另一個區域中分解。聲明有利於將星標放在變量名旁邊,但在類型名旁邊加上明星星(如果你正在爲了易讀性而編寫的,這是C的一種寫作編程語言不一致的形式) – 2014-10-17 15:01:50

80

沒關係。現在有人會出面解決問題,其他人會展示如何在相同的聲明中聲明多個變量,而int *a方式更好地反映代碼的語法結構,並且另一個人會顯示Stroustrup更喜歡int* a的方式。

許多意見,但沒有「正確」的方式在這裏。

+33

SO的真正的主人,以預測所有這一點:) – 2010-04-18 00:57:53

+1

我不知道,但沒有一個實際的務實原因與如何語言gramm ar創建了星號的解析?如果我想到函數指針聲明('rt(* f)()')和多變量聲明('t * a,* b'),我會認爲星號符合它的**標識符正確的**,類似於'const'實際上限定了其左側的標識符(除了首先在語句中)。 – 2016-02-25 08:46:23

+0

@ v.odd這個論點就是我總結的「int *更好地反映語法結構的方法」:)但是編寫好代碼的目的並不是模仿標準中使用的語法。首先和最重要的代碼應該可以工作,並且可以維護,你可以爭辯。 – 2016-02-25 09:52:05

13

我認爲把星號旁邊的變量名稱更清晰。

您可能錯誤地聲明someType* one, two;認爲它們都是指針,但只有變量one是一個指針; two只是一個someType。聲明爲someType *one, *two可避免此問題。

+0

好的,但你第一次輸入'two-> doSomething()'你會立即看到你在任何現代IDE中犯的錯誤,所以這真的沒什麼大不了的。 – mrt 2017-10-20 06:25:07

+1

@mrt你的論點只有在類型是有成員的類型時才成立;如果類型是像'int'或float這樣的標量,則沒有成員可以調用。 – 2017-11-11 20:00:30

+1

@ShammelLee是的,你有一個點!當我發表評論時,沒有想過簡單的類型。 – mrt 2017-11-13 05:32:28

18

的差值的出現是因爲C++加入更強的類型系統C. AC程序員通常認爲在以下方面的頂部「值」,所以

int *pValue; 

讀取「p值的解引用是一個int」 而一個C++程序員認爲在「類型」,所以

int* pValue; 

讀取「類型p值是指向int的指針」 編譯器看到在所有當然沒有什麼區別。但是你會發現它是C編程人員在C++編程時堅持「值語義」。

+0

只適用於這個「價值語義學」的狹義非傳統定義。對於通用的定義,即在任何可能/實際情況下,返回值和值傳遞都是首選,那絕對是一件C++的事情。 C++逐步添加了許多功能來促進按值語義,而C除了_as-if_規則外沒有任何其他功能,並且這傾向於鼓勵人們通過指針傳遞。 – 2017-06-04 20:19:46