C++中int* p与int** p有什么区别?各自适用场景是什么?
C++中
int*与int**的区别、适用场景及使用方法 核心区别
int*是单级int指针:存储的是int类型变量的内存地址,仅需1次解引用即可获取对应的int值int**是二级int指针:存储的是**int*类型一级指针**的内存地址,需要2次解引用才能获取最终的int值
各自适用场景
int*适用场景
- 存储单个int变量的地址,实现对变量的间接修改,常用于需要修改实参值的函数传参场景
- 指向动态申请的一维int数组,比静态数组更灵活,可在运行时确定数组长度
- 作为函数输出参数,用于同时返回多个int类型结果
int**适用场景
- 指向动态申请的二维int数组,尤其适合实现行长度不一致的不规则二维数组
- 需要在函数内部修改传入的
int*类型指针本身的指向时使用(C++默认值传递,直接传一级指针仅能修改指针指向的内容,无法修改指针本身的指向) - 存储
int*类型的指针数组,用于批量管理多个独立的一维int数组
具体使用示例
int*使用示例
// 场景1:间接修改普通int变量 int num = 20; int* p_num = # *p_num = 30; // 执行后num的值变为30 // 场景2:指向动态一维数组 int* arr = new int[3]{1,2,3}; for(int i = 0; i < 3; i++){ // 两种访问方式等价:arr[i] 等价于 *(arr + i) cout << arr[i] << endl; // 依次输出1、2、3 } delete[] arr; // 释放动态申请的数组内存
int**使用示例
// 场景1:函数内修改一级指针的指向 void allocArr(int** pp, int size){ *pp = new int[size]; // 直接修改原一级指针的指向 } int* p = nullptr; allocArr(&p, 5); // 传入一级指针p的地址 p[0] = 10; // 可正常操作新申请的数组 delete[] p; // 场景2:实现不规则二维数组 int rowCnt = 2; int** twoDArr = new int*[rowCnt]; twoDArr[0] = new int[3]{1,2,3}; // 第一行长度为3 twoDArr[1] = new int[2]{4,5}; // 第二行长度为2 cout << twoDArr[0][2] << endl; // 输出3 cout << twoDArr[1][1] << endl; // 输出5 // 释放内存需要逐层操作 for(int i = 0; i < rowCnt; i++){ delete[] twoDArr[i]; } delete[] twoDArr;
注意事项
- 所有指针使用前必须判空,避免野指针访问触发程序崩溃
- 动态申请的内存必须匹配释放:
new对应delete,new[]对应delete[],避免内存泄漏 - 二级指针必须逐层解引用,每一层指针都要确保指向合法内存后才能继续操作
内容的提问来源于stack exchange,提问作者Daniel Reynard
相关产品推荐
相关产品推荐

