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

C/C++ 指標陷阱:陣列指標位移的經典筆試題解析

     編輯:關於C++

許多開發者在轉換語言(Java、C#)多年後重拾 C/C++,最容易栽在指標運算上。這道經典面試題完美揭示了 &a(陣列指標)與 a(首元素指標)在指標位移時的本質差異。

題目程式碼

int main(int argc, char *argv[]) {
    int a[] = {1,2,3,4,5};
    int* p = (int*)(&a + 1);
    cout << "a = " << *(a+1) << endl;
    cout << "p = " << *(p-1) << endl;
    return 0;
}

輸出結果

a = 2
p = 5

深度解析

運算式類型位移單位實際位址變化
aint*(指向首元素)sizeof(int)a+1 指向 a[1]
&aint(*)[5](指向整個陣列)5*sizeof(int)&a+1 指向陣列結尾 a[5]
p = (int*)(&a+1)強制轉為 int*sizeof(int)p-1 退回一個 int 大小,落在 a[4](值 5)

核心觀念

  • 指標類型決定位移步長:&a 是「陣列指標」,+1 跨越整個陣列;轉為 int* 後,-1 僅退一個 int。
  • 位址相同、語意不同:a、&a、&a[0] 數值相等,但編譯器眼中類型截然不同。
  • 實務啟示:對多維陣列、結構體指標操作時,務必明確類型,避免以 void* 或強制轉型掩蓋邏輯錯誤。
「C/C++ 的指標運算看似簡單,實則暗藏類型系統的精妙設計。搞懂這道題,才算真正踏入指標的大門。」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved