簡體   English   中英

為什么指針 (*) 和數組 ([]) 符號綁定到變量名而不是變量聲明中的類型?

[英]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, ZXYZ為我們提供了表達式的“圖片”,例如b*bb[10]*b[10]和很快。 聲明的標識符的實際類型源自圖片:由於*b[10]是一個int ,那么b[10]是一個指向int的指針,所以b是一個包含 10 個指向int指針的數組。

當我們連續聲明多個指針/數組時,為什么必須在每個變量前面放置 *, [] ?

答案是:顯式優於隱式。 在這種情況下,我們甚至可以在同一行上聲明不同的類型, int *a, *b, c; 依此類推,在另一種情況下,它會太亂。 第二個問題同樣如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM