You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:15:04