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

C語言 sizeof 運算子深度解析:資料型別大小與位址輸出

     編輯:關於C語言

C語言 sizeof 運算子深度解析:資料型別大小與位址輸出

sizeof 是 C 語言中唯一在**編譯期**計算的運算子(變長陣列除外),它返回型別或運算式佔用的位元組數。本文結合實例,徹底釐清基本型別大小、指標大小、陣列退化與位址輸出格式等核心概念。

基本型別大小測試

#include <stdio.h>

int main() {
    printf("sizeof(char)   = %zu\n", sizeof(char));   // 1
    printf("sizeof(short)  = %zu\n", sizeof(short));  // 2
    printf("sizeof(int)    = %zu\n", sizeof(int));    // 4 (32/64位系統常見)
    printf("sizeof(float)  = %zu\n", sizeof(float));  // 4
    printf("sizeof(double) = %zu\n", sizeof(double)); // 8
    printf("sizeof(long)   = %zu\n", sizeof(long));   // 4 (32位) 或 8 (64位 Linux/macOS)
    return 0;
}

關鍵觀察點

  1. sizeof 返回 size_t(無號整數):輸出格式應用 %zu (C99),而非 %d。
  2. long 大小平台相關:Windows 64 位為 4 (LLP64),Linux/macOS 64 位為 8 (LP64)。
  3. char 永遠為 1:標準保證 sizeof(char) == 1,其他型別以 char 為單位衡量。

位址輸出與指標大小

#include <stdio.h>

int main() {
    int sum = 99;
    printf("sum 的位址: %p\n", (void *)&sum);  // 正確輸出位址格式
    printf("指標大小: %zu\n", sizeof(&sum));    // 4 (32位) 或 8 (64位)
    return 0;
}

輸出範例

sum 的位址: 0x7ffeefbff5ac
指標大小: 8

核心知識點總結

運算式結果說明
sizeof(int)4型別大小
sizeof(sum)4變數型別大小
sizeof(&sum)8/4指標大小(平台相關)
sizeof(*&sum)4解參考後為 int 型別
sizeof(arr)40陣列完整大小(不退化)
sizeof(arr[0])4單元素大小
sizeof(*arr)4等同 arr[0]

陣列退化與 sizeof 的特殊規則

  • 兩種不退化情況:sizeof(arr)、&arr(取陣列位址,型別為 int(*)[10])。
  • 其他場合全退化:傳遞給函數、賦值給指標、陣列下標運算等,均退化為首元素位址 int*。

常見錯誤避坑

  1. 用 %d 輸出 sizeof:64 位系統 size_t 為 8 位元組,%d 只讀 4 位元組,導致輸出錯誤。
  2. 用 %x/%d 輸出位址:必須用 %p 配合 (void*) 強轉,保證可移植性。
  3. 以為指標大小固定:32 位為 4,64 位為 8,與資料型別無關。

總結

sizeof 是編譯期運算子,掌握其「不求值、只看型別」特性與「陣列退化」例外規則,是寫出正確、可移植 C 程式的基石。位址輸出務必使用 %p,型別大小輸出務必使用 %zu。

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