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

C/C++ 經典面試題:數組指鈐、首地址與強制轉換陷阱

     編輯:C++ 入門

代碼分析

int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a + 1);
int *p1 = a;
int *p2 = &a[0];
int *p3 = (int *)(&a);

核心結論

  • p1 == p2 == p3 全為真,輸出 2 5。
  • &a 類型為 int (*)[5],&a + 1 跳過整個數組(+5*sizeof(int))。
  • ptr = (int*)(&a+1) 強轉為 int*,指向數組尾後位置。
  • *(ptr-1):ptr 作為 int* 向前移一個 sizeof(int),落在 a[4],值為 5。
  • p3 = (int*)(&a) 強轉後類型為 int*,指向 a[0],故 p1==p3。若無強轉編譯報錯。
  • ++p1、++p3 同為 int* 步長相同,故 p4==p5。

關鍵知識點

  1. 指鈐運算步長取決於指鈐類型:&a 步長為整個數組,int* 步長為單個 int。
  2. 強制類型轉換改變指鈐類型進而改變運算行為:(int*)(&a) 與 &a 地址相同但類型不同。
  3. a、&a、&a[0] 地址值相同,但類型分別為 int*、int(*)[5]、int*。

總結

此題考察指鈐類型、地址運算、強制轉換三者交互。許多開發者混淆「地址值相同」與「類型相同」,導致指鈐運算出錯。牢記:指鈐類型決定解引用大小與運算步長,強轉僅改變類型不改變地址值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved