在 C++ 中,指針可以像數組一樣進行循環遍歷和賦值,這是利用了“數組名退化為指針”以及“指針算術(pointer arithmetic)”的特性。
一、基本原理
- 數組在大多數表達式中會自動退化為指向首元素的指針。
- 指針支持
+、-、++、--等運算,稱為指針算術。 p + i表示從指針p起偏移i個元素(不是字節!),等價於&arr[i]。
二、循環遍歷數組
int main() {
int arr[] = { 1, 2, 3, 4 };
int* arr_p = arr;
int i = 0;
for (; i < 4; i++) {
printf("位置%d的值是%d\n",i, *(arr_p + i));
}
return 0;
}
位置0的值是1
位置1的值是2
位置2的值是3
位置3的值是4
循環賦值:
int main() {
int arr[4]; // java需要new,C++不需要
int* arr_p = arr;
int i = 0;
for (; i < 4; i++) {
*(arr_p + i) = i;
}
i = 0;
for (; i < 4; i++) {
printf("位置%d的值是%d\n",i, *(arr_p + i));
}
return 0;
}
位置0的值是0
位置1的值是1
位置2的值是2
位置3的值是3
三、指針操作的幾種方式
int main() {
int arr[] = { 1, 2, 3, 4 };
int* arr_p = arr;
// 第一種方式:下標法
int i = 0;
for (; i < 4; i++) {
printf("下標法 位置%d的值是%d\n", i, arr_p[i]);
}
// 第二種方式:指針偏移法
i = 0;
for (; i < 4; i++) {
printf("指針偏移法 位置%d的值是%d\n", i, *(arr_p + i));
}
// 第三種方式:指針遞增法
i = 0;
for (; i < 4; i++) {
printf("指針遞增法 位置%d的值是%d\n", i, *arr_p);
arr_p++;
}
return 0;
}
下標法 位置0的值是1
下標法 位置1的值是2
下標法 位置2的值是3
下標法 位置3的值是4
指針偏移法 位置0的值是1
指針偏移法 位置1的值是2
指針偏移法 位置2的值是3
指針偏移法 位置3的值是4
指針遞增法 位置0的值是1
指針遞增法 位置1的值是2
指針遞增法 位置2的值是3
指針遞增法 位置3的值是4
四、注意事項
- 不要越界訪問:
p + i必須在有效範圍內(如[arr, arr + n))。 - 確保指針非空:使用前檢查
if (p != nullptr)(尤其對動態分配的指針)。 - 對於動態數組(
new[]),同樣適用
int* p = new int[5];
for (int i = 0; i < 5; ++i) {
*(p + i) = i * 10;
}
delete[] p;