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

C++ 數組指針訪問元素詳解:`int (*p)[5]` 定義、函數返回局部數組指針陷阱與正確用法

     編輯:程式設計綜合問答

代碼還原與錯誤分析

using arry = int[5];
arry* chen() {
    int a[5]; // 局部數組,棧上分配
    // ... 賦值 ...
    return &a; // 返回局部數組地址 → **懸空指針**,函數返回後棧幀銷毀,內容不可預期
}

int main() {
    int (*b)[5]; // 數組指針:指向 int[5] 類型
    b = chen();
    for (int i=0; i<5; i++) cout << (*b)[i] << endl; // 未定義行為
}

核心問題

  1. 返回局部數組指針:`a` 在 `chen()` 棧幀中,函數返回後內存釋放,指針指向垃圾數據。
  2. 數組指針聲明語法:`int (*b)[5]` 讀作「b 是指向 int[5] 的指針」,優先級:`()` > `[]` > `*`。

三種正確解決方案

方案一:靜態/全局數組(生命周期覆蓋整個程序)

int a[5]; // 全局/靜態存儲區
arry* chen() {
    // ... 賦值 a ...
    return &a; // 安全:內存永久有效
}

方案二:動態分配(調用者負責釋放)

arry* chen() {
    int (*p)[5] = new int[1][5]; // 或 malloc(sizeof(int[5]))
    // ... 賦值 (*p)[i] ...
    return p;
}
int main() {
    int (*b)[5] = chen();
    // 使用 ...
    delete[] b; // 必須釋放
}

方案三:結構體/類封裝數組(RAII,現代 C++ 首選)

struct Array5 { int data[5]; };
Array5 chen() {
    Array5 arr;
    // ... 賦值 arr.data[i] ...
    return arr; // C++17 RVO/NRVO 消除拷貝,安全高效
}
int main() {
    Array5 arr = chen();
    for (int i=0; i<5; i++) cout << arr.data[i] << endl;
}

數組指針訪問元素的四種等價寫法

假設 `int (*b)[5]` 指向有效數組:

寫法解釋
`(*b)[i]`解引用指針得數組,再下標訪問(最直觀)
`*(*b + i)`指針算術:`*b` 是數組首地址,`+i` 偏移,再解引用
`b[0][i]`視 `b` 為指向一維數組的指針數組,取第 0 個再下標
`(*(b + 0))[i]`同 `b[0][i]`,顯式指針偏移

現代 C++ 最佳實踐

  • **避免裸指針操作數組**,優先用 `std::array` (固定長) 或 `std::vector` (動態長)。
  • 函數返回容器:`std::array chen();` — 值語義、無內存管理負擔、支持拷貝/移動。
  • 需跨 C 接口時,再用 `int*` + 長度參數,或 `gsl::span` (Guideline Support Library)。

理解「棧上局部數組不可返回指針」、「數組指針聲明語法」、「RAII 封裝替代裸指針」,C++ 數組操作即刻專業化。

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