首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 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))

逐項推導(假設 a 起始 0x1000,int 4 位元組)

選項型別運算結果位址等於 &a[1]?
Aint*a + 4 (sizeof(int)=4,指標+4 跳 4 個 int = 16 位元組)0x1010❌ (正確是 0x1004)
Bint*&a[0] + 1 → 跳 1 個 int = 4 位元組0x1004✅
Cint*(int*)&a + 1 → &a 型別 int(*)[10],+1 跳整個陣列 40 位元組,再轉 int*0x1028❌
Dint*(char*)&a + 4 → 位元組+4,轉 int*0x1004✅

答案

A 與 C 都不等於 &a[1],但單選題通常考察 A(sizeof(int) 與指標算術步長混淆最易錯)。

驗證程式

#include 
int main(void) {
    int a[10] = {1,2,3,4,5,6,7,8,9,0};
    printf("a+sizeof(int) = %p\n", (void*)(a + sizeof(int)));
    printf("&a[0]+1      = %p\n", (void*)(&a[0] + 1));
    printf("(int*)&a+1   = %p\n", (void*)((int*)&a + 1));
    printf("(int*)((char*)&a+sizeof(int)) = %p\n", (void*)((int*)((char*)&a + sizeof(int))));
    printf("&a[1]        = %p\n", (void*)&a[1]);
    return 0;
}

輸出對照

a+sizeof(int) = 0x7ffe...10
&a[0]+1      = 0x7ffe...04
(int*)&a+1   = 0x7ffe...28
(int*)((char*)&a+sizeof(int)) = 0x7ffe...04
&a[1]        = 0x7ffe...04
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved