訪問數組當我們使用操作者[]
像這樣:運算符[]的正確輸入數據類型是什麼?
int a[5];
...
a[b] = 12;
什麼是上述可變b
正確的數據類型?
我發現a[b]
相當於*(a + b)
,這讓我覺得,我想b
是void*
或size_t
但是,我不知道。
訪問數組當我們使用操作者[]
像這樣:運算符[]的正確輸入數據類型是什麼?
int a[5];
...
a[b] = 12;
什麼是上述可變b
正確的數據類型?
我發現a[b]
相當於*(a + b)
,這讓我覺得,我想b
是void*
或size_t
但是,我不知道。
a
和b
之一必須是指針,而另一個必須是任何整數類型。證明如下。
a[b]
由於是相同的(*((a)+(b)))
的每個C 2011(n1570)6.5.2.1 2,a
和b
可以使得後者表達式定義的任何類型。
根據6.5.3.2 2,一元運算符*
運算符必須具有指針類型。因此,(a)+(b)
的結果必須具有指針類型。
每6.5。在圖6中,二進制運算符接受各種類型的組合,但是唯一產生指針類型的組合是指針和整數的組合,如6.5.6所述8.
根據6.5.6 8,一個整數可以被添加到一個指針,並且結果具有指針操作數的類型。第6.5.6條對+
的操作數的順序沒有區別,因此它們可以按任何順序排列。因此,a
和b
之一可能是指針,而另一個將是整數。
b
被稱爲索引這是一個數字。所以你可以把它作爲整數處理。 a[b]
將訪問b
數組a
的第th個元素。
*(a + b)
將在(a + (b * sizeof(data type of array element)))
給值少數種類可以正常工作,由於隱式轉換。
A char
將被提升爲int
。 int
或unsigned int
也可以工作。 short
或unsigned short
也是有效的類型。
即使a[b]
相同*(a + b)
,b
不能是一個指針,因爲a
已經是一個指針。二元運算符+
不接受兩個指針。
當'a'是任何整數類型,'b'是指針時,表達式'a [b]'在C中是合法的,反之亦然。二進制'+'運算符確實接受指針和整數或整數和指針。 –
@EricPostpischil現在編輯清楚,我的意思是兩個指針。你的評論是真實的,但我從來沒有反對過它。 – Xaqq
從C標準(ISO/IEC 9899:TC2)二段6.5.2.1數組下標
後綴表達式,隨後在方括號
[]
一個表達式是一個下標一個指定 數組對象的元素。下標運算符[]
的定義是E1[E2]
與(*((E1)+(E2)))
相同。因爲 適用於二元+運算,如果E1是一個數組對象(等同於一個指針數組對象的 初始元件)和E2是整數轉換規則的,E1[E2]
指定的E2-th
元件E1
(從零開始計數)。
假設,會長時間工作嗎?或者它會被轉換爲整數? – zztops
@zztops:任何整數類型都可以工作,包括「long」。 –
+1用於演示。 – Xaqq
我會一直比較喜歡'[]'裏面的'int',因爲它最流行,也是'int [array]'不如base/index清晰。第二個'array [++ i]'對我來說是理解的,但是'++ i [array]'不是(傳染都是不一樣的),而且'array [array [array]'是錯誤的。 –
只有當你可以假設你的數組不是很大時,這幾乎總是真的(除非當然不是這樣)。見http://ewontfix.com/9/ :) – loreb