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

C語言細節30:數組指針經典面試題——&a+1 vs a+1

     編輯:關於C語言

C語言細節30:數組指針經典面試題——&a+1 vs a+1

代碼


核心區別

表達式類型+1 的意義地址增量
&aint(*)[5](數組指針)跨越整個數組+5×sizeof(int)=20字節
aint*(元素指針)指向下一元素+sizeof(int)=4字節
(int)aint(整數)整數加1+1字節

內存佈局圖解

a[0] a[1] a[2] a[3] a[4]
|----|----|----|----|----|
^a   ^a+1         ^&a+1
&a 指向整個數組,&a+1 指向數組後緊鄰位置

ptr1 與 ptr2 解析

  • ptr1 = (int*)(&a+1):指向數組末尾後的int*,ptr1[-1]即a[4] = 5
  • ptr2 = (int*)((int)a+1):將首地址強轉為整數+1,再轉回int*,指向a[0]的第2個字節(小端模式下為0x00)

輸出結果(假設a地址0x7fff0000,小端32位int)

&a = 0x7fff0000
&a+1 = 0x7fff0014  (+20字節)
a = 0x7fff0000
a+1 = 0x7fff0004   (+4字節)
(int)a+1 = 0x7fff0001  (+1字節)
ptr1[-1] = 5, *ptr2 = 0  (a[0]=1, 低字節在前,第二字節為0)

考點總結

  1. &a類型是數組指針,步長=整個數組大小
  2. a退化為首元素指針,步長=元素大小
  3. 強轉(int)a變為整數運算,失去類型語義
  4. ptr1[-1]技巧:反向訪問數組最後一個元素

這道題精準考察數組名退化規則、指針類型決定算術步長、強制類型轉換語義改變——是C指釖功力的試金石。

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