首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 陣列位址運算深度解析:a、&a、a+1、&a+1 的本質差異

     編輯:關於C++

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;
}

核心概念解析

1. a:陣列退化為首元素指標

在大多數表達式中,陣列名稱 a 會隱性轉換為 int* 型別,指向第一個元素 a[0] 的位址。數值等同 &a[0]。

2. &a:陣列完整型別的位址

&a 型別為 int (*)[10](指向含 10 個 int 的陣列指標)。雖然數值與 a 相同,但型別語意不同,決定了指標運算的步進大小。

3. a + 1:指標運算,步進單位為元素大小

型別為 int*,+1 表示移動一個 int 大小(4 bytes),指向 a[1]。

4. &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)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved