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

C/C++ 陣列排序實戰:陣列名與指標作為函式參數的本質差異

     編輯:VC 教學

核心認知:陣列作為參數時退化為指標

無論宣告為 void f(int arr[])、void f(int arr[10])、void f(int* arr),**函式內 arr 型別均為 int***,接收的是呼叫端陣列的**首元素地址**。函式對陣列元素的修改**直接反映到原陣列**。

範例一:陣列名稱(退化指標)實現反轉排序


void reversal(int x[], int n) {  // 等價 int* x
    int m = (n - 1) / 2;
    int temp;
    for (int i = 0; i <= m; ++i) {
        int j = n - 1 - i;
        temp = x[i];
        x[i] = x[j];
        x[j] = temp;
    }
}

int main() {
    int a[10] = {0,1,2,3,4,5,6,7,8,9};
    reversal(a, 10);  // 傳遞 &a[0]
    // a 變為 {9,8,7,6,5,4,3,2,1,0}
}

範例二:顯式指標運算實現相同邏輯


void reversal(int* x, int n) {
    int* i = x;
    int* p = x + (n - 1) / 2;  // 中點
    int* j = x + n - 1;        // 尾端
    int temp;
    for (; i <= p; ++i, --j) {
        temp = *i;
        *i = *j;
        *j = temp;
    }
}

兩種寫法本質對比

關鍵陷阱提醒

  • 函式內 sizeof(x) 失效:得到指標大小,非陣列大小 → **必須傳遞長度參數**。
  • 陣列名稱不可修改:呼叫端 a 是常量指標,a++ 編譯錯誤;函式內參數 x 是區域指標變數,可 x++。
  • 多維陣列退化規則不同:int a[3][4] → int (*)[4](指向 4-int 陣列的指標),非 int**。

現代 C++ 排序最佳實踐


#include 
#include 
#include 

int a[10] = {0,1,2,3,4,5,6,7,8,9};
std::reverse(std::begin(a), std::end(a));  // C++11 範圍版
std::sort(std::begin(a), std::end(a));     // 升序
std::sort(std::begin(a), std::end(a), std::greater{}); // 降序

// 配合容器
std::vector v = {5,2,8,1,9};
std::sort(v.begin(), v.end());

優點:型別安全、不丟失長度、支援自訂比較、經優化(Introsort)、可並行化 (C++17 std::execution::par)。

總結

陣列名/指標作為排序函式參數**本質相同**,皆為首元素地址傳遞,原陣列會被修改。理解退化機制、指標運算等價性、sizeof 失效陷阱,是正確使用 C 風格介面的前提。現代 C++ 開發請優先使用標準庫演算法與容器,將裸陣列/指標限制在 ABI 邊界層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度陣列下標 x[i]指標運算 *(p+i)
可讀性直觀,符合數學慣例需理解指標遞增語義
編譯器優化現代編譯器生成相同機器碼同左
邊界檢查無內建(同指標)無內建
適用場景隨機存取、固定步長串流處理、未知長度、指標算術