首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C語言二維數組行交換:指針操作與內存本質解析

     編輯:程式設計綜合問答

問題描述

字符二維數組 char a[][7] = {"foo", "bar", "foobar"};,想交換第 0 行和第 2 行的內容。

核心誤區

二維數組名 a 是數組指針常量(類型 char (*)[7]),不能修改指向,即無法執行 a[0] = a[2] 這類指針賦值操作。

正確方法:逐元素交換內容

void swapRows(char a[][7], int row1, int row2, int cols) {
    for (int i = 0; i < cols; i++) {
        char temp = a[row1][i];
        a[row1][i] = a[row2][i];
        a[row2][i] = temp;
    }
}

int main() {
    char a[][7] = {"foo", "bar", "foobar"};
    swapRows(a, 0, 2, 7);
    // 現在 a[0]="foobar", a[2]="foo"
    return 0;
}

進階理解:二維數組內存佈局

內存連續佈局(行優先):
a[0]: f o o \0 x x x  ← 7 bytes
a[1]: b a r \0 x x x  ← 7 bytes  
a[2]: f o o b a r \0  ← 7 bytes
地址遞增 →
  • 每行固定佔用 7 個字節(包含結束符 \0)
  • a[i] 相當於 *(a + i),偏移 i * 7 字節
  • 無法像指針數組 char* a[] 那樣交換行指針

對比:指針數組可以交換行指針

char* ptrArray[] = {"foo", "bar", "foobar"};  // 指針數組
// 可以直接交換指針
char* temp = ptrArray[0];
ptrArray[0] = ptrArray[2];
ptrArray[2] = temp;  // O(1) 時間複雜度

總結

類型聲明行交換方式時間複雜度
二維數組char a[][7]逐字符交換內容O(cols)
指針數組char* a[]交換指針值O(1)

根據數據結構選擇合適的交換策略,二維數組只能「搬運數據」,指針數組可以「搬運指針」。

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