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; // 未定義行為
}
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; // 必須釋放
}
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]`,顯式指針偏移 |
理解「棧上局部數組不可返回指針」、「數組指針聲明語法」、「RAII 封裝替代裸指針」,C++ 數組操作即刻專業化。