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

C語言數組循環移位:指針算術錯誤導致編譯失敗的修復與算法優化

     編輯:C 語言問答

錯誤代碼分析


void move(int arr[], int m) {
    int i;
    if (i >= 0 && i <= N-1-m) {  // ❌ i 未初始化
        for (i = 0; i <= m-1; i++)
            *arr(i+m-1) = *arr(i);  // ❌ arr() 非法語法,應為 arr[]
    }
    // ...
}

編譯錯誤解讀

  • error C2064: term does not evaluate to a function:arr(i) 被解析為函數調用,但 arr 是數組/指針,不可調用
  • 正確訪問語法:arr[index] 或 *(arr + index)

修正版移位函數(環狀右移 m 位)


#include 
#include 
#include 

#define N 10

// 三次反轉法:時間 O(N),空間 O(1)
void rotate_right(int arr[], int n, int m) {
    m %= n;  // 處理 m > n 情況
    if (m == 0) return;
    
    // 1. 反轉整個數組
    for (int i = 0, j = n-1; i < j; i++, j--) {
        int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
    }
    // 2. 反轉前 m 個
    for (int i = 0, j = m-1; i < j; i++, j--) {
        int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
    }
    // 3. 反轉後 n-m 個
    for (int i = m, j = n-1; i < j; i++, j--) {
        int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
    }
}

// 輔助:打印數組
void print_arr(int arr[], int n) {
    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    printf("\n");
}

int main() {
    int arr[N], m;
    printf("Enter %d numbers: ", N);
    for (int i = 0; i < N; i++) scanf("%d", &arr[i]);
    printf("Enter m: "); scanf("%d", &m);
    
    printf("Original: "); print_arr(arr, N);
    rotate_right(arr, N, m);
    printf("Rotated:  "); print_arr(arr, N);
    return 0;
}

算法對比

方法時間複雜度空間複雜度特點
臨時數組法O(N)O(N)直觀易懂,需額外內存
單步移位法O(N×m)O(1)m 較大時效率低
三次反轉法O(N)O(1)✅ 推薦:原地、高效、標準庫實現
環狀替換法O(N)O(1)需 gcd 判斷循環數,較複雜

指針參數最佳實踐


// 等價聲明
void rotate_right(int arr[], int n, int m);
void rotate_right(int *arr, int n, int m);  // 推薦:語義更清晰

// 內部訪問
arr[i]          // 數組下標法(推薦,可讀性強)
*(arr + i)      // 指針算術法(等價)

理解數組退化為指針、下標與指針算術等價性,是寫出正確高效 C 代碼的基石。

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