在 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)
常見用途:
- 修改指針本身(如動態分配內存並返回指針)
void createArray(int** ptr, int size) {
*ptr = new int[size]; // 修改傳入的指針變量
}
- 處理指針數組
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]三個地址是一樣的,這裏只需要記住:數組指針指向的是數組的首地址。