在 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;