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

C 語言遞歸函數主調用參數傳遞:二級指針帶出運行結果

     編輯:程式設計疑難解答

問題代碼分析


void Table(int k, int **a, int C) { ... }
int main() {
    int k = 3;
    Table(k, a); // 錯誤:a 未聲明,參數不匹配
}

核心問題

  • 函數簽名要求 int **a(二級指針),但 main 中未聲明 a,且調用時少傳第三個參數 C。
  • int a[N][N] 是二維數組,退化為 int (*)[N](指向數組的指針),不是 int**。

正確調用方式

方案一:修改函數參數匹配二維數組(推薦)


// 函數聲明
void Table(int k, int a[][N], int C); // 或 int (*a)[N]

// main 中
int a[N][N] = {0};
Table(k, a, 0); // 傳入二維數組名,自動退化為 int (*)[N]

方案二:動態分配二級指針(若必須用 int**)


int main() {
    int k = 3;
    // 分配行指針數組
    int **a = (int**)malloc(N * sizeof(int*));
    for (int i = 0; i < N; i++) {
        a[i] = (int*)malloc(N * sizeof(int));
    }
    
    Table(k, a, 0);
    
    // 釋放
    for (int i = 0; i < N; i++) free(a[i]);
    free(a);
}

代碼邏輯補充:循環賽日程表生成

代碼實現 2^k 名選手循環賽日程表(分治法):

  1. 第一行按選手編號填入 1..n。
  2. 每輪將上半區對角線複製到下半區,實現「對角線對稱」配對。
  3. m 為當前塊大小,每輪翻倍 1, 2, 4...。

關鍵修正點

  1. 主函數聲明 int a[N][N] 而非 int **a。
  2. 函數參數改為 int a[][N] 或 int (*a)[N]。
  3. 調用傳入 a(數組名),補齊第三個參數(即使不使用也要佔位)。
  4. 函數內部直接用 a[i][j] 訪問,無需二級指針解引用。

// 修正後完整主函數
#define N 8
int a[N][N];

void Table(int k, int a[][N], int C) {
    // ... 原邏輯,直接用 a[i][j]
}

int main() {
    int k = 3;
    Table(k, a, 0); // 正確調用
    // 打印驗證
    for (int i = 1; i <= 8; i++) {
        for (int j = 1; j <= 8; j++) printf("%d ", a[i][j]);
        printf("\n");
    }
    return 0;
}

理解「二維數組 ≠ 二級指針」,正確匹配函數參數類型,是 C 語言避免段錯誤的關鍵。

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