是否有一個原因的C語言設計者同時用於定義一個指針類型爲什麼使用*符號來定義一個指針和取消引用?
int* x;
和取消引用指針的明星?
int y = *x;
使用了兩個不同的東西相同的字符顯得撲朔迷離,特別是因爲他們在同樣的情況下始終使用。
是否有一個原因的C語言設計者同時用於定義一個指針類型爲什麼使用*符號來定義一個指針和取消引用?
int* x;
和取消引用指針的明星?
int y = *x;
使用了兩個不同的東西相同的字符顯得撲朔迷離,特別是因爲他們在同樣的情況下始終使用。
在Quora上有關於此主題的出色答案是Brian Bi。我逐字逐句複製。 http://www.quora.com/C-programming-language/Why-doesnt-C-use-better-notation-for-pointers
該聲明一個指針和一個星號 解除引用一個指針當使用時使用星號的事實並不是某種 可用性毛刺在C.它是故意的。
還有兩種其他符號可以這樣工作。在聲明數組時,您可以使用方括號 ,並且在訪問數組時使用方括號。聲明函數 指針時使用括號,並且在調用函數指針時使用括號。
聲明如下使用。
考慮以下聲明:int * a;這個聲明告訴你 * a的類型是int。換句話說,a是一個指向int的指針。
這個怎麼樣:int * a [10];這個聲明告訴你,* a [i] (其中我介於0和9之間,包括0和9)是int類型的。由於陣列 索引比指針廢棄更高的優先級,這告訴你 ,一個是東西,你可以使用[上(即數組),然後(即指針) 使用*] ...你會因此得到一個int。換言之,a是指向int的指針的數組[10]。 (* a)[10];
int(* a)[10];這個聲明告訴你(* a)[i]是int類型的。 由於a是可以使用*的東西,它必須是一個指針。然後 你可以在結果上使用[]來獲得一個int。所以我們看到 a的類型必須是指向int的數組[10]的指針。
請注意,上述兩個聲明僅在圓括號中有所不同!但是 您不必記住您可能想要聲明的每種類型 的括號。寫下你將如何使用變量 並在開始時擊掌最後一種類型,就像在上面的兩個 示例中一樣。爲了優先權原因,您必須插入任何括號, 也包括在聲明中。
許多C程序員都無法記住如何聲明函數 指針。當您記住 聲明遵循使用時,這也變得容易。例如,讓我們聲明一個函數指針,我們可以使用它來保存函數strcpy的地址。這個變量是 ,爲了使用,你首先解除引用(用),然後用 調用using(),其中括號中包含兩個參數;第一個 是char,第二個是const char *。結果是char *。
讓我們調用我們的函數指針p。我們做的第一件事是 取消引用,所以我們寫下* p。然後我們調用p的論據 焦炭和爲const char *,所以在旁邊的括號內* P寫下來的那些: (P)(焦,爲const char *)。 (由於函數調用的優先級高於解引用的優先級,所以括號需要在p 左右。) 最後,預先使用結果,即char函數返回。所以我們的聲明是:char *(p)(char,const char *);
const是一個特例。聲明中的關鍵字const適用於 ,無論您只是部分使用變量 ,您會得到什麼樣的結果,但是一旦「獲得」就停止。這意味着那個特殊的東西 不能改變。
現在,我相信你知道const char * s;聲明一個指向 的常量字符。這是有道理的,因爲開始的東西是 const char,即* s的結果是const char。不過,你也可以用char const * s;的形式寫出它。我們的解釋是 我們可以「得到」到* s,然後我們看到const這個詞,所以這意味着我們到目前爲止的內容是const。忽略const的 時刻,我們看到char。所以* s是一個char,它也是const,因爲字const是* s的前綴。
現在怎麼樣char * const s;?這意味着const指向char。 指針不能改變,但它指向的東西可以。這是 ,因爲關鍵字const是在s之前直接出現的,所以它可以說是在「解除引用」運算符的「 」中。 s在const 被取消引用之前是const,但* s不是const。聲明char const * const s;或者const char * const s;意思是指向const char的const指針。
對於雙指針(和更高),這是相同的交易。 const char ** p; 聲明一個指向const char的指針,就像char const ** p ;. 但是,char * const * p;聲明一個指向char的指針, 和char ** const p; delcare一個指向char的指針的const指針。
只要記住,聲明遵循使用,你永遠不會被 混淆聲明語法再次。
可能重複[爲什麼解除引用操作符(\ *)還用於聲明一個指針?](http://stackoverflow.com/questions/8685514/why-is-the-dereference-operator-also -used-to-declare-a-pointer) – OldProgrammer
你會提出什麼替代方案? – Mehrdad
請在提問這樣的問題之前對SO進行搜索。 – OldProgrammer