在C語言中, a N 與 a N 有什麼區別?

時間 2021-05-30 10:58:48

1樓:知了

剛好有看過這裡,嘗試著回答一下。

這其實和C語言運算子優先順序有關,弄懂這一點就會比較清楚,這裡涉及兩個運算子,下標引用和間接訪問*。

下標引用運算子優先順序高於間接引用,所以*a[N]首先是乙個陣列,而陣列的元素是指標;

加上小括號之後,即在(*a)[N]中,要先進行"*"運算,所以a是乙個指標,指向乙個具有N個元素的陣列。

2樓:Sayako Hoshimiya

我竟然刷到了乙個C語言的問題……而且我竟然無聊到把它回答了……

下面正文:

個人覺得這篇文章Reading C type declarations說的不錯,推薦閱讀。

另外就是Expert C Programming中有一張圖,也告訴你了如何閱讀type declaration,同時還有很多文字內容舉例告訴你具體如何閱讀它。

這其實是C語言的乙個不太好的設計哲學,現代程式語言如Scala/Haskell等都將型別通過說明符的方式統一寫在後面(或前面),這樣能夠給型別閱讀提供方便。不過C語言的設計哲學是如何使用就如何定義,所以閱讀起來需要從declarator中間開始一會向左一會兒向右最後在type specifier結束……

好的,我們看圖,希望你可以把它背下來,這樣之後對你閱讀和書寫型別宣告很有幫助。(另外再推薦這本Expert C Programming,作為閱讀完C Primer Plus之後的閱讀材料,然後你可以看再C語言之父的The C Programming Language)

第1步,找到最左側的identifier,說identifier is。

第2步,已經分析的符號的右側有方括號嗎?沒有。(注意是a的右側緊挨著的非空白字元,在此例中,是「)」)

第3步,已經分析的符號的右側有左括號嘛?沒有。

第4步,已經分析的符號左側是左括號嗎?不是。

第5步,左側符號是const, volatile, *之一嘛?是的,說pointer to,然後再次回到步驟4。

第4步,已經分析的符號左側是左括號嗎?是的,這是乙個括號將我們已經閱讀和處理的declaration進行grouping的括號,找到對應的右括號然後回到步驟2。

第2步,已經分析的符號右側有方括號嗎?有(此時已經分析的符號是(*a),右側有方括號),從左到右,對於每對方括號,說array of。

第3步,同(3),略

(4), (5),沒有

第6步,左側剩餘的型別組成了declaration的標準型別,閱讀剩餘的型別,說int

將以上分析過程中我們說的東西按順序組合起來:

identifier is pointer to array of int

我們優化一下語法組成乙個句子:

The identifier "a" is a pointer to an array of int.

很好,翻譯成中文:

識別符號a是乙個指向乙個int陣列的指標。

那麼,對於類似的*a[N],將其變為int *a[N];以補全declaration,我省略分析過程直接說結果:

The identifier "a" is an array of a pointer to int.

翻譯一下就是:

識別符號a是乙個int指標的陣列。

注意這個declaration方式不僅在C語言中有效,你也可以用類似的方法閱讀C++的declaration。同時還有一點需要注意,有一些declaration是非法的,引用Expert C Programming:

最後的最後,我想讓你現在就去讀一下Expert C Programming的第三章,Unscrambling Declarations in C。

C code. C code run. Run code run…please! —Barbara Ling

3樓:

參閱《c++ primer, Fifth Edition》

Chapter 2.2.2. Variable Declarations and Definitions

Chapter 4.1.2 Precedence and Associativity 優先順序與結合性

Chapter 4.12. Operator Precedence Table 列出了個operator的Precedence and Associativity

看完這些後你會明白的

* ,dereference operator,解引用操作符,Associativity 右

,subscript operator,下標運算子,Associativity 左

的Precedence比*的高

Type (*a)[N]

*a是乙個陣列,陣列有N個元素,元素的型別是Type,a是乙個指標,指向這個陣列

Type *a[N]

a先與結合,a是乙個陣列,陣列有N個元素,元素的型別是Type*

4樓:維惟唯維鳩

之前第六幅圖畫錯了,sorry我智障。

先講(*a)[N]

這是a,它是乙個指標,指向乙個陣列

這是*a,它是a指向的陣列

這是(*a)[N],是*a的N位元素

再說*a[N]

這是a,它是乙個陣列

這是a[N],陣列的元素這是*a[N],是這個元素(也是個指標)所指向的物件

————原答案第六幅圖(錯的)————

這是*a[N],它是指向這個元素的指標

5樓:

*a <=> *(a + 0)<=>a[0]那麼(*a)[N] <=> a[0][N]*a[N] <=> a[N][0]

自己定乙個二維陣列試試就明白了

C 語言中, 與 有什麼區別?

三才朝元 在有結構體變數名的時候可以用 在只有結構體指標的時候還是用 比較好,這時候用 總覺得很奇怪 點運算子 左邊為結構體名稱。箭頭運算子 左邊為結構體指標。如下 typedef struct定義乙個結構體型別 DATAchar key 10結構體成員 key char name 20結構體成員 ...

C語言和C 有什麼區別?

LeeCarry 首先實名沒有幫助 單爾博 的回答,我也不知道他自己懂不懂還是抖機靈,但是很不負責任。抖機靈後面也要加句但c 和c關係很大吧。c 之父都不敢說和c沒關係吧,而且他們重疊的面積有多大,有多少c不經修改就能在c 上面跑就不用我多說了吧。下面是正經回答題主問題 網上有很多詳細資料我就不班門...

在C 中 String Empty和 有什麼區別?

Ken.W 這類問題去stackoverflow問效果更好 榮浩 String.Empty是String類裡已經例項化好的靜態唯讀空字串,我們可以直接拿來用。而對於 系統需要去託管堆上例項化乙個空字串,效能略差一些吧 這種說法是錯誤的!Strings1 String Empty Strings2 C...