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

C/C++ 陣列指標算術與位移深度解析:一維與二維陣列

     編輯:關於C語言

核心概念:陣列名稱的型別與位移單位

陣列名稱在大多數情境下會退化為「指向第一個元素的指標」,但 &arr 保留「整個陣列」的型別。指標運算的位移單位取決於指標的基礎型別。

一維陣列 int a[3] = {1,2,3}

運算式型別位移單位位移量(相對 a)
&aint (*)[3]整個陣列大小 (12 bytes)0
a / &a[0]int *單一元素 (4 bytes)0
&a + 1int (*)[3]12 bytes+12 bytes(陣列結尾)
a + 1 / &a[0] + 1int *4 bytes+4 bytes(指向 a[1])

一維陣列記憶體佈局

二維陣列 int a[3][3]

運算式型別位移單位位移量
&aint (*)[3][3]整個陣列 (36 bytes)0
a / &a[0]int (*)[3]一列大小 (12 bytes)0
a[0] / &a[0][0]int *單一元素 (4 bytes)0
&a + 1int (*)[3][3]36 bytes+36 bytes
a + 1 / &a[0] + 1int (*)[3]12 bytes+12 bytes(指向第 2 列)
a[0] + 1 / &a[0][0] + 1int *4 bytes+4 bytes(指向 a[0][1])

二維陣列記憶體佈局

三層級別總結

  1. 最高層:&a —— 整個陣列物件
  2. 中層:a、&a[0] —— 第一維(列)
  3. 最低層:a[0]、&a[0][0] —— 單一元素

實務應用:函數參數傳遞

// 錯誤:void func(int a[][])  // 編譯錯誤,需知第二維大小
// 正確寫法:
void func1(int a[][3], int rows);           // 二維陣列退化為指向「含3個int的陣列」指標
void func2(int (*a)[3], int rows);          // 等價寫法
void func3(int *a, int rows, int cols);     // 攤平成一維,手動計算索引 a[i*cols + j]

常見錯誤

  • sizeof(a) 在函數參數中會退化為指標大小,非陣列總大小
  • 將 int ** 當作二維陣列傳入(指標陣列 ≠ 二維陣列)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved