註標運算子:[]
語法
postfix-expression [ expression ]
備註
後置運算式 (也可以是主要運算式) 後面會加上指派陣列索引的註標運算子 [ ]
。
如需 C++/CLI 中受控陣列的相關資訊,請參閱陣列。
通常,postfix-expression 所代表的值是指標值 (例如陣列識別碼),而 expression 則是整數值 (包括列舉類型)。 不過,在語法上需要的是其中一個指標類型的運算式,另一個則是整數類型。 因此,整數值可以在 postfix-expression 位置,而指標值則可以在 expression 的括弧中,或是在註標位置。 請考慮下列程式碼片段:
int nArray[5] = { 0, 1, 2, 3, 4 };
cout << nArray[2] << endl; // prints "2"
cout << 2[nArray] << endl; // prints "2"
在上述範例中,運算式 nArray[2]
與 2[nArray]
相同。 其原因是註標運算式 e1[e2]
是由下列運算式指定:
*((e2) + (e1))
運算式所產生的位址不是來自位址 e1 的 e2 位元組。 相反地,這個位址會進行縮放,以產生陣列 e2 中的下一個物件。 例如:
double aDbl[2];
aDb[0]
和 aDb[1]
的位址皆為 8 個位元組,即為類型 double
物件的大小。 此項縮放是由 C++ 語言根據物件類型自動完成,其定義於加法類運算子中,其中會討論指標類型運算元的加法和減法。
註標運算式也可以擁有多個註標,如下所示:
expression1[expression2] [expression3] ...
註標運算式的關聯是由左至右。 最左邊的註標運算式 expression1[expression2] 會最先評估。 expression1 和 expression2 相加所產生的位址會形成指標運算式,然後 expression3 會加入這個指標運算式形成新的指標運算式,依此類推,直到加入最後一個註標運算式為止。 除非最後一個指標值定址為陣列類型,否則間接取值運算子 (*
) 會在最後一個註標運算式評估之後套用。
具有多個註標的運算式會參考多維陣列的元素。 所謂的多維陣列是指其中所包含的元素也是一種陣列。 例如,三維陣列的第一個元素是具有兩個維度的陣列。 下列範例會宣告和初始化一個簡單的二維字元陣列:
// expre_Subscript_Operator.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
#define MAX_ROWS 2
#define MAX_COLS 2
int main() {
char c[ MAX_ROWS ][ MAX_COLS ] = { { 'a', 'b' }, { 'c', 'd' } };
for ( int i = 0; i < MAX_ROWS; i++ )
for ( int j = 0; j < MAX_COLS; j++ )
cout << c[ i ][ j ] << endl;
}
正數和負數註標
陣列的第一個元素是元素 0。 C++ 陣列的範圍是從陣列[0] 到陣列[大小– 1]。 不過,C++ 支援正註標和負註標。 負註標必須在陣列界限內,如果不在界限內,則無法預測結果。 下列程式碼顯示正的和負的陣列註標:
#include <iostream>
using namespace std;
int main() {
int intArray[1024];
for (int i = 0, j = 0; i < 1024; i++)
{
intArray[i] = j++;
}
cout << intArray[512] << endl; // 512
cout << 257[intArray] << endl; // 257
int *midArray = &intArray[512]; // pointer to the middle of the array
cout << midArray[-256] << endl; // 256
cout << intArray[-256] << endl; // unpredictable, may crash
}
最後一行中的負註標可能會產生執行階段錯誤,因為它在記憶體中指出的位址比陣列的原點少 256 int
位置。 指標 midArray
會初始化至 intArray
的中央,因此能夠在上面使用正的和負的陣列索引 (但是危險的)。 陣列註標錯誤不會產生編譯時間錯誤,但是會產生無法預期的結果。
註標運算子可以交替。 因此,只要註標運算子不多載,運算式 array[index] 和 index[array] 保證會相等 (請參閱多載運算子)。 第一種形式是最常用的程式撰寫作法,但兩種都可以運作。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應