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

C 語言指針筆試題解析:哪個表達式不能表示 a[1] 的地址?

     編輯:關於C語言

指針算術經典筆試題

題目:int a[10]; 下列哪個表達式**不能**表示 a[1] (第二個元素) 的地址?

A. a + sizeof(int)
B. &a[0] + 1
C. (int*)&a + 1
D. (int*)((char*)&a + sizeof(int))

逐項分析 (假設 32 位系統,sizeof(int)=4,a 地址為 0x1000)

選項表達式類型計算過程結果地址是否正確
Aa + sizeof(int)int*指針算術:a + 4 → 地址 + 4*4 = +16 字節0x1010 (a[4])❌ 錯誤
B&a[0] + 1int*指針算術:&a[0] + 1 → 地址 + 1*4 = +4 字節0x1004 (a[1])✅ 正確
C(int*)&a + 1int*&a 類型 int(*)[10],+1 → 跳過整個數組 +40 字節0x1028 (a[10] 越界)❌ 錯誤
D(int*)((char*)&a + sizeof(int))int*&a 轉 char* → 字節算術 +4 → 再轉 int*0x1004 (a[1])✅ 正確

核心知識點

  1. 數組名 a vs &a:
    • a 類型 int*,值為首元素地址 (&a[0]),步長 sizeof(int)。
    • &a 類型 int(*)[10] (指向整個數組的指針),值同 a,但步長 sizeof(int[10]) = 40。
  2. 指針算術步長由指針類型決定:
    • int* + 1 → +4 字節。
    • char* + 1 → +1 字節。
    • int(*)[10] + 1 → +40 字節。
  3. sizeof(int) 是字節數,不可直接加在 int* 上:選項 A 犯了「以字節為單位加在元素指針上」的低級錯誤。
  4. 選項 D 技巧:先轉 char* 做字節級偏移,再轉回目標類型,實現任意字節偏移的通用技法。

驗證代碼

#include 
int main() {
    int a[10] = {1,2,3,4,5,6,7,8,9,0};
    printf("a[1] 地址: %p 值: %d\n", &a[1], a[1]);
    printf("A: %p 值: %d\n", a + sizeof(int), *(a + sizeof(int)));       // a[4]
    printf("B: %p 值: %d\n", &a[0] + 1, *(&a[0] + 1));                   // a[1] ✅
    printf("C: %p 值: %d\n", (int*)&a + 1, *((int*)&a + 1));             // a[10] 越界
    printf("D: %p 值: %d\n", (int*)((char*)&a + sizeof(int)), *((int*)((char*)&a + sizeof(int)))); // a[1] ✅
    return 0;
}

答案

選項 A 和 C 都不能表示 a[1] 的地址。若單選最典型錯誤為 **A** (直接用字節數加元素指針)。

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