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

C 語言 sizeof 深度解析:操作符本質、數組退化、指針算術差異

     編輯:關於C

核心認知:sizeof 是運算符,非函數

  • 編譯期計算(動態數組除外),無運行開銷;
  • 參數可為類型(需括號)或表達式(無需括號);
  • 不求值表達式:sizeof(a++) 不會真正執行 a++。

案例一:函數參數數組退化為指針

void fun(int arr[10]) {
    printf("fun: %zu\n", sizeof(arr)); // 輸出 4/8 (指針大小)
}
int main() {
    int arr[10];
    printf("main: %zu\n", sizeof(arr)); // 輸出 40 (10*4)
    fun(arr);
}

鐵律:數組作函數參數傳遞時退化為指針,sizeof 失去長度信息。解決方案:額外傳長度、結構體封裝、C99 變長數組(VLA)。

案例二:sizeof 不求值副作用

short a = 0;
printf("%zu\n", sizeof(a++)); // 輸出 2 (short 大小)
printf("%d\n", a);            // 輸出 0 (a 未遞增)

案例三:數組名 vs &數組名

int arr[10];
int *p = arr;           // arr 退化為首元素地址 &arr[0]
int (*q)[10] = &arr;    // &arr 類型為 int(*)[10],數組整體地址

printf("%p\n", arr);    // 0x7fff...
printf("%p\n", &arr);   // 0x7fff... (數值相同,類型語義不同)

printf("%p\n", p+1);    // 0x7fff... + 4 (sizeof(int))
printf("%p\n", q+1);    // 0x7fff... + 40 (sizeof(int[10]))

關鍵差異:p+1 步長為元素大小,q+1 步長為整個數組大小。這是二維數組指針遍歷的基礎。

總結表

表達式類型sizeof 結果+1 步長
arrint* (退化)整個數組字節數sizeof(int)
&arrint(*)[10]整個數組字節數整個數組字節數
*arr / arr[0]intsizeof(int)N/A
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved