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

C++ 指針與數組作為函數參數:選擇排序降序實現的常見錯誤修正

     編輯:程式設計疑難解答

實驗需求

用指針與數組作為函數參數,以「擂台法」(選擇排序)對一維實型數組 a[10] 進行降序排序。要求展示四種參數傳遞組合:

  1. 實參數組名,形參數組
  2. 實參數組名,形參指針
  3. 實參指針變量,形參數組
  4. 實參指針變量,形參指針

測試數據:10, 25, 90, 80, 70, 35, 65, 40, 55, 5

原代碼存在的兩個關鍵錯誤

1. 交換邏輯下標錯誤(越界)

// 原代碼 Sort2 中
temp = *(pa + max);
*(pa + max) = *(pa + j);  // 錯誤:j 循環結束時為 n,導致訪問 pa[n] 越界
*(pa + j) = temp;

修正:應與外層循環變量 i 交換:

*(pa + max) = *(pa + i);
*(pa + i) = temp;

2. 內層循環起始位置錯誤

// 原代碼
for (j = 0; j < n; j++)  // 錯誤:應從 i+1 開始,避免重複比較已排序部分

修正:

for (j = i + 1; j < n; j++)

Sort1 中同樣需修正。

修正後完整代碼

#include <iostream>
using namespace std;

void Sort1(int a1[], int n) {  // 形參為數組
    int i, j, temp, max;
    for (i = 0; i < n - 1; i++) {
        max = i;
        for (j = i + 1; j < n; j++) {
            if (a1[max] < a1[j]) max = j;
        }
        temp = a1[max];
        a1[max] = a1[i];
        a1[i] = temp;
    }
    for (i = 0; i < n; i++) cout << a1[i] << " ";
    cout << endl;
}

int *Sort2(int *pa, int n) {  // 形參為指針
    int i, j, temp, max;
    for (i = 0; i < n - 1; i++) {
        max = i;
        for (j = i + 1; j < n; j++) {
            if (*(pa + max) < *(pa + j)) max = j;
        }
        temp = *(pa + max);
        *(pa + max) = *(pa + i);
        *(pa + i) = temp;
    }
    return pa;
}

int main() {
    int a[] = {10, 25, 90, 80, 70, 35, 65, 40, 55, 5};
    int *p = a;
    int t;

    // 情況1:實參數組名,形參數組
    Sort1(a, 10);
    // 情況2:實參數組名,形參指針
    int *sort_2 = Sort2(a, 10);
    for (t = 0; t < 10; t++) cout << *(sort_2 + t) << " ";
    cout << endl;
    // 情況3:實參指針,形參數組
    Sort1(p, 10);
    // 情況4:實參指針,形參指針
    int *sort_4 = Sort2(p, 10);
    for (t = 0; t < 10; t++) cout << *(sort_4 + t) << " ";
    cout << endl;

    return 0;
}

知識點總結

  • 數組名作為實參傳遞時,實際傳遞的是首元素地址,形參可聲明為數組 int a[] 或指針 int *a,效果等價。
  • 指針變量作為實參傳遞,形參同樣可聲明為數組或指針。
  • 選擇排序核心:外層控制輪數,內層從 i+1 尋找最大值下標,最後與 i 交換。
  • 指針算術 *(pa + i) 等價於 pa[i],靈活運用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved