C++ 陣列名稱在不同上下文中呈現不同語意,特別是位址運算時極易混淆。本文透過具體範例,徹底釐清 a、&a、a+1、&a+1 的實際意義與數值差異。
#include <iostream>
using namespace std;
int main() {
int a[10]; // 40 bytes (10 * 4 bytes)
cout << "a = " << a << endl; // 陣列首元素位址
cout << "&a = " << &a << endl; // 陣列本身位址
cout << "a + 1 = " << a + 1 << endl; // 指向第二個元素
cout << "&a + 1 = " << &a + 1 << endl; // 指向陣列結尾下一個位置
return 0;
}

a:陣列退化為首元素指標在大多數表達式中,陣列名稱 a 會隱性轉換為 int* 型別,指向第一個元素 a[0] 的位址。數值等同 &a[0]。
&a:陣列完整型別的位址&a 型別為 int (*)[10](指向含 10 個 int 的陣列指標)。雖然數值與 a 相同,但型別語意不同,決定了指標運算的步進大小。
a + 1:指標運算,步進單位為元素大小型別為 int*,+1 表示移動一個 int 大小(4 bytes),指向 a[1]。
&a + 1:陣列指標運算,步進單位為整個陣列大小型別為 int (*)[10],+1 表示移動一個完整陣列大小(40 bytes),指向陣列 a 結尾之後的下一個陣列位置(即 &a[10])。
位址: 0x1000 0x1004 0x1008 ... 0x1024 0x1028
+------+------+------+ +------+------+
a: | a[0] | a[1] | a[2] | ... | a[9] | |
+------+------+------+ +------+------+
^ ^ ^
a a+1 &a+1
void func(int arr[]) 等同 void func(int* arr),失去大小資訊。void func(int (&arr)[10]) 參考傳遞或 std::array / std::vector。sizeof(a) 在陣列宣告作用域內回傳完整大小(40),但傳遞給函式後退化為指標,sizeof 回傳指標大小(4 或 8)。