[英]Why pointer (*) and array ([]) symbols are bound to variable name and not to type in variable declaration?
關於 C(以及 C++ 的 C 子集)中指針和數組聲明的細節,SO 上有很多問題。
我對為什么更感興趣。
當我們連續聲明多個指針/數組時,為什么必須將*
, []
放在每個變量的前面?
int *a, *b;
int c[1], d[1];
為什么我們必須在函數指針中的變量名之后/周圍鍵入內容?
void (*foo_ptr)(int, int);
為什么我們有這個讓很多新手感到困惑的功能,甚至編譯器也會識別並報告這些東西作為類型的一部分? 例如: function foo accepts int** but it was given int*
我想我正在尋找它背后的直覺,導致它以這種方式被創建,以便我可以將它應用於我對語言的理解。 現在我只是看不到它......
Kernighan 和 Ritchie 在The C Programming Language 1978 年第 90 頁中寫道:
指針
px
的聲明是新的。
int *px;
旨在作為助記符; 它表示組合
*px
是一個int
,也就是說,如果px
出現在上下文*px
,它相當於一個int
類型的變量。 實際上,變量聲明的語法模仿了變量可能出現的表達式的語法。 這種推理在所有涉及復雜聲明的情況下都很有用。 例如,
double atof(), *dp;
表示在表達式中
atof()
和*dp
具有double
類型的值。
因此,我們看到,在諸如int X, Y, Z
、 X
、 Y
和Z
為我們提供了表達式的“圖片”,例如b
、 *b
、 b[10]
、 *b[10]
和很快。 聲明的標識符的實際類型源自圖片:由於*b[10]
是一個int
,那么b[10]
是一個指向int
的指針,所以b
是一個包含 10 個指向int
指針的數組。
當我們連續聲明多個指針/數組時,為什么必須在每個變量前面放置 *, [] ?
答案是:顯式優於隱式。 在這種情況下,我們甚至可以在同一行上聲明不同的類型, int *a, *b, c;
依此類推,在另一種情況下,它會太亂。 第二個問題同樣如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.