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

C 語言 sizeof、記憶體位址與多維陣列深度解析

     編輯:C 語言入門

sizeof 運算子

  • 編譯期計算型別或運算式佔用的位元組數(size_t)。
  • sizeof(int)、sizeof 變數、sizeof (型別)。
  • 不計算動態分配大小:sizeof(p) 只會給指標大小(4/8 位元組)。

記憶體位址基本觀念

  • 位址以位元組為單位編址,每個位元組唯一編號。
  • 變數位址 = 其儲存空間第一個位元組的位址。
  • &a 取得變數 a 位址,型別為 類型 *。

一維陣列位址關係

int a[5];
printf("%p %p %p\n", (void*)a, (void*)&a[0], (void*)&a); // 全部相同
// a      : 陣列首元素位址(型別 int*)
// &a     : 整個陣列位址(型別 int(*)[5])
// a+1    : 位址 + sizeof(int)
// &a+1   : 位址 + sizeof(int[5])

二維陣列記憶體佈局(列優先 Row-Major)

int a[2][3] = {{1,2,3},{4,5,6}};
// 記憶體連續:1 2 3 4 5 6
// a      == &a[0]           == &a[0][0]
// a[0]   == &a[0][0]        (型別 int*)
// a[1]   == &a[1][0]        (型別 int*)
// &a     == &a[0]           (型別 int(*)[3])

關鍵等式:a == a[0] == &a[0][0](數值相同,型別不同)。

二維陣列初始化規則

sizeof 對陣列與指標的差異

int a[2][3];
sizeof(a)       // 24 (2*3*4)
sizeof(a[0])    // 12 (3*4)
sizeof(a[0][0]) // 4
int *p = a[0];
sizeof(p)       // 4/8 (指標大小),非陣列大小

函數參數傳遞:陣列退化為指標

void f(int a[][3]);     // 必須指定列數
void f(int (*a)[3]);    // 等價寫法
// 呼叫:f(arr);  // arr 為 int[2][3],退化為 int(*)[3]

常見錯誤與修正

寫法結果
int a[2][3] = {{1,2},{3}};剩餘補 0 → {{1,2,0},{3,0,0}}
int a[][3] = {1,2,3,4,5,6};自動推導行數 = 2,**列數不可省略**
int a[2][] = {...};❌ 錯誤:編譯器無法計算列跨度
錯誤說明修正
int a[10]; for(i=1;i<=10;i++) a[i]=0;下標越界(0~9)for(i=0;i<10;i++)
int a[2][3]; a[1,2] = 5;逗號運算子,等同 a[2] 越界a[1][2] = 5;
printf("%s", a); // a 為 int 陣列型別不匹配,亂碼/崩潰逐元素列印或用 %d
int *p = a; p++; 於 int a[2][3]p 型別不匹配int (*p)[3] = a;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved