2009-06-30 118 views
5

我對C++比較陌生(約一年的開發經驗)。我很好奇導致type * name作爲定義指針的語法的決定的原因。在我看來,語法應該是type & name,因爲&符號在代碼中用於引用變量的內存地址。因此,使用的int指針的傳統例如:爲什麼我們在定義指針時使用「type * var」而不是「type&var」?

int a = 1; 
int * b = &a; 

將成爲

int a = 1; 
int & b = &a 

我敢肯定有一些原因,我只是沒有看到,我很樂意聽聽來自C++老兵的一些輸入。

謝謝, -S

+2

不要說「C/C++」。 C和C++是不同的語言。 – 2009-06-30 02:05:38

+0

改變了它,但不要在兩個指針都以相同的方式工作? – spencewah 2009-06-30 02:06:47

+0

C沒有參考。 – 2009-06-30 02:07:49

回答

7

C++採用C語法。如在「The Development of the C Language」(由Dennis Ritchie所述)中所示,C使用*來指示類型聲明中的指針,因爲已經決定應使用類型語法。

對於[化合物類型]的每一個對象,已經有提底層對象的方式:索引數組,調用函數,使用間接運算符[*]上的指針。類比推理導致名稱的聲明語法映射名稱通常出現的表達式語法的名稱。因此,

int i, *pi, **ppi; 

聲明一個整數,指向一個整數的指針,指向一個指向整數的指針。這些聲明的語法反映了當在表達式中使用時,i,* pi和** ppi都會產生int類型。

這裏的一個更復雜的例子:

int *(*foo)[4][]; 

這聲明意味着表達*(*foo)[4][0]的類型爲int,並從該(以及[]具有比一元*更高的優先級)可以解碼的類型: foo是一個指向int數組指針數組大小4的指針。

此語法在C++中與C兼容。另外,不要忘記C++在聲明中可以使用&。

int & b = a; 

上面一行是指參考變量指的int類型的另一變量。引用和指針之間的差別大概是引用僅被初始化,並且不能更改它們指向的位置,最後它們總是自動取消引用。

int x = 5, y = 10; 
int& r = x; 

int sum = r + y; // you do not need to say '*r' automatically dereferenced. 

r = y; // WRONG, 'r' can only have one thing pointing at during its life, only at its infancy ;) 
1

你的第二個例子是不是有效的C代碼,只有C++代碼。不同之處在於一個是指針,而另一個是參考。

在右側的'&'總是意味着地址。在一個定義中它表明該變量是一個參考。

右側的'*'總是意味着地址上的值。在一個定義中它表明該變量是一個指針。

引用和指針是相似的,但不相同。這article解決了差異。

+0

我不認爲第二個區塊是*應該是合法代碼 - 這是一個假設的例子。 – 2009-06-30 02:06:55

1

代替讀int* b爲 「b爲int的指針」,它讀作int *b: 「* b是整數」。然後,您有&作爲反*:* b是一個int。 *b的地址是&*b,或者只是b。

-2

我認爲答案很可能是「因爲這是K & R做到的方式。」

downvoting傻瓜。解釋我爲什麼錯了。

K & R是決定聲明指針的C語法是什麼的人。

這不是int & x;而不是int * x; ķ& R.

3

如果你是一個視覺思想家,它可以幫助想像星號作爲黑洞導致數據值 - 因爲這是方式的語言是由誰做了定義的傢伙。因此,它是一個指針。

和符號是所述孔的相對的端部,把它作爲一個拆開星號或宇宙飛船在一個不穩定的過程擺動大約爲先導越過脫出黑洞的過渡。

我記得被C++重載的&符號的含義給了我們引用很困惑。在他們拼命試圖避免使用更多的角色,這是由國際聽衆使用C和已知的鍵盤限制問題是合理的,他們增加了一個主要混亂的來源。

在C++中可能有所幫助的一件事是將引用看作預先準備的取消引用的指針。當您傳遞參數時,您不是使用& someVariable,而是在定義someVariable時使用了尾隨和符號。再一次,這可能會讓你更加困惑!

我的一個寵物的恨,我就不高興了蘋果的Objective-C的樣品中看到頒佈,是佈局風格int *someIntPointer而不是int* someIntPointer

恕我直言,保持星號與變量是一個老式的C ^方法強調如何定義變量的數據類型。

someIntPointer的數據類型實際上是一個指向整數的指針,聲明應該反映這一點。這也導致你每行聲明一個變量的要求,以避免微妙的錯誤,如:

int* a, b; // b is a straight int, was that our intention? 

int *a, *b; // old-style C declaring two pointers 

int* a; 
int* b; // b is another pointer to an int 

雖然人們認爲有能力在同一行聲明混合指針和值,故意,是一個功能強大功能,我已經看到它導致微妙的錯誤和困惑。

4

我認爲丹尼斯里奇在The Development of the C Language回答這樣的:

對於這樣的構成 類型的每個對象,已經有一種方法來 提底層對象:索引 陣列,呼叫該函數在指針上使用間接操作符 。 類比推理導致 聲明語法用於鏡像 名稱的名稱通常出現的表達式語法 。因此,

int i, *pi, **ppi; 

聲明的整數,一個指向 整數,一個指針的指針 整數。這些 聲明的語法反映了觀察 ,當在表達式中使用時,i,* pi和** ppi都會產生一個int類型 。 同樣,

int f(), *f(), (*f)(); 

聲明函數返回一個 整數,功能的 指針返回的整數,一個指針指向一個 函數返回一個整數;

int *api[10], (*pai)[10]; 

聲明指針數組以 整數,和一個指針的 整數數組。在所有這些情況下,變量的 聲明類似於 其在 類型的聲明中用於 聲明頭部的聲明。

因此,我們使用type * var來聲明一個指針,因爲這允許聲明鏡像指針的使用(取消引用)。

在這篇文章中,裏奇也敘述在「NB」,「B」類的編程語言的擴展版本,他用int pointer[]的指針聲明到int,相對於int array[10]申報int秒的陣列。

相關問題