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

C 語言指標與二維陣列:行指標運算與記憶體佈局深度解析

     編輯:C 語言基礎

二維陣列概念上有行列,但記憶體中所有元素連續排列,無縫隙。C 語言按行優先儲存:先存第 0 行,再存第 1 行...

二維陣列分解為一維陣列

int a[3][4] 可視為三個一維陣列 a[0]、a[1]、a[2],每個含 4 個 int 元素。

二維陣列指標定義

int (*p)[4] = a;
  • p 指向類型為 int[4] 的一維陣列(即二維陣列的一行)。
  • () 不可省略,否則 int *p[4] 變成指標陣列。

指標運算對應行跳轉

p 指向類型 int[4](16 位元組),p+1 前進 16 位元組 → 指向下一行,p-1 回上一行。

陣列名 a 在表達式中等價於 p

透過指標存取元素層層推導

  1. p → 第 0 行地址;p+1 → 第 1 行地址。
  2. *(p+1) → 取地址上資料 = 整個第 1 行(多個元素)。
  3. *(p+1)+1 → 表達式中行資料轉為首元素地址 → 第 1 行第 1 個元素地址。
  4. *(*(p+1)+1) → 取值 → 第 1 行第 1 個元素值。

等價關係總表

a+i        == p+i
a[i]       == p[i] == *(a+i) == *(p+i)
a[i][j]    == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)

範例:指標遍歷二維陣列

#include <stdio.h>
int main() {
    int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
    int (*p)[4] = a;
    int i, j;
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++)
            printf("%2d ", *(*(p+i)+j));
        printf("\n");
    }
    return 0;
}

指標陣列 vs 二維陣列指標

int *(p1[5]); // 指標陣列,佔 20 位元組 (32位)
int (*p2)[5]; // 二維陣列指標,佔 4 位元組

本質不同:前者是陣列(元素為指標),後者是單一指標(指向二維陣列)。

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