在 C++ 中,二級指針(也稱指針的指針)和多級指針是用於間接訪問內存的高級指針形式。它們的核心思想是:指針本身也是一個變量,也有地址,可以用另一個指針來指向它


一、一級指針


int a = 10;
int* p = &a;  // p 是一級指針,存儲 a 的地址
  • p 指向 a
  • *p 得到 a 的值(10)


二、二級指針


二級指針是指向一級指針的指針。

#include<stdio.h>

// 二級指針和多級指針
int main() {
	int num = 12;
	// int* 指針 & 取地址
	int* p = #

	int** s_p = &p; // 對一級指針取地址

	// 一級指針:000000D7624FF954,二級指針:000000D7624FF978
	printf("一級指針:%p,二級指針:%p\n", p, s_p);

	**s_p = 13;

	// num = 13
	printf("num = %d", num);
	return 0;
}
  • s_p 存儲的是 p 的地址
  • *s_p 得到 p(即 &num
  • **s_p 得到 num 的值(12)

C++進階學習(三)二級指針和多級指針_c++

C++進階學習(三)二級指針和多級指針_數組指針_02

常見用途:

  1. 修改指針本身(如動態分配內存並返回指針)
void createArray(int** ptr, int size) {
    *ptr = new int[size];  // 修改傳入的指針變量
}
  1. 處理指針數組
char* names[] = {"Alice", "Bob"};
char** pNames = names;  // pNames 是二級指針

三、多級指針(三級及以上)

理論上可以有任意級指針(如 int***int****),但實際中很少超過三級。

int a = 5;
int* p1 = &a;
int** p2 = &p1;
int*** p3 = &p2;

// 訪問原始值
std::cout << ***p3;  // 輸出 5

雖然語法支持,但多級指針會顯著降低代碼可讀性和維護性,應儘量避免濫用。

四、數組與數組指針

// 數組與數組指針
int main() {
	// 定義數組
	int arr[] = { 1, 2, 3, 4 };

	// 遍歷數組 , linux有問題
	//for (int i = 0; i < 4; i++){
	//	printf("%d\n", arr[i]);
	//}

	//// for循環再 c 和 c++ 中正確的寫法
	//int i = 0;
	//for (; i < 4; i++){
	//	printf("%d\n", arr[i]);
	//}

	                                                                                                  
	// arr的值 = arr取地址的值, arr 地址的值 = arr[0]的地址的值(首地址)
	printf("arr = %p\n", arr);// arr = 000000B8006FF908
	printf("arr = %p\n", &arr);// arr = 000000B8006FF908
	printf("arr = %p\n", &arr[0]);// arr = 000000B8006FF908

	// 如何獲取數組的指針
	int* arr_p = arr; // 數組指針指向的是數組的首地址

	// 做一系列的操作
	printf("%d\n", *arr_p); // 1

	// 對指針進行 ++
	arr_p++;

	printf("%d\n", *arr_p); // 2

	arr_p += 2;

	printf("%d\n", *arr_p); // 4

	return 0;
}

可以看到 arr&arr&arr[0]三個地址是一樣的,這裏只需要記住:數組指針指向的是數組的首地址。