当前位置: 首页 > news >正文

一级指针和二级指针作为函数参数的区别

在函数参数中,一级指针(int*)和二级指针(int**)的核心区别在于能修改的数据层级:一级指针可修改指针指向的变量值,而二级指针可修改一级指针本身(包括其指向或分配的内存)

一级指针作为函数参数

作用:通过一级指针,函数可以修改指针所指向的变量的值,但无法修改指针自身的指向或为其分配新内存(因为函数接收的是指针的副本)。


示例 1:用一级指针修改外部变量的值

#include <iostream>
using namespace std;// 一级指针作为参数:修改指针指向的变量值
void modifyValue(int* p) 
{*p = 100;  // 正确:修改p指向的变量(外部的x)
}int main() 
{int x = 10;int* ptr = &x;cout << "修改前:x = " << x << endl;  // 输出:10modifyValue(ptr);                     // 传入一级指针cout << "修改后:x = " << x << endl;  // 输出:100(x被修改)return 0;
}

示例 2:一级指针无法修改自身指向
#include <iostream>
using namespace std;// 尝试通过一级指针修改指针的指向(失败)
void changePointer(int* p) 
{int y = 20;p = &y;  // 仅修改函数内的副本,外部ptr不受影响
}int main() 
{int x = 10;int* ptr = &x;cout << "修改前:*ptr = " << *ptr << endl;  // 输出:10changePointer(ptr);cout << "修改后:*ptr = " << *ptr << endl;  // 仍输出:10(ptr指向未变)return 0;
}

原因:函数接收的是ptr的副本,修改副本的指向不会影响外部原始指针。

二、二级指针作为函数参数

作用:通过二级指针,函数可以修改一级指针本身(包括其指向、分配的内存等),因为二级指针存储了一级指针的地址。


示例 3:用二级指针修改一级指针的指向

#include <iostream>
using namespace std;// 二级指针作为参数:修改一级指针的指向
void changePointer(int** pp) 
{int y = 20;*pp = &y;  // 通过二级指针修改一级指针(ptr)的指向
}int main() 
{int x = 10;int* ptr = &x;cout << "修改前:*ptr = " << *ptr << endl;  // 输出:10changePointer(&ptr);                        // 传入一级指针的地址(二级指针)cout << "修改后:*ptr = " << *ptr << endl;  // 输出:20(ptr指向已改为y)return 0;
}

示例 4:用二级指针为一级指针动态分配内存
#include <iostream>
using namespace std;// 二级指针作为参数:为外部一级指针分配内存
void allocMemory(int** pp, int size) 
{*pp = new int[size];  // 为外部指针分配内存for (int i = 0; i < size; i++) {(*pp)[i] = i;     // 初始化数组}
}int main() 
{int* arr = nullptr;   // 未分配内存的一级指针allocMemory(&arr, 5); // 传入arr的地址(二级指针)// 验证内存分配结果cout << "数组元素:";for (int i = 0; i < 5; i++) {cout << arr[i] << " ";  // 输出:0 1 2 3 4}delete[] arr;  // 释放内存return 0;
}

三、核心区别总结

img

http://www.jsqmd.com/news/14356/

相关文章:

  • ROUGE指标
  • CSP-S 模拟 29
  • 实用指南:【编号508】(道路分类)湖南路网数据湖南路网分类数据(2025年)
  • Linux 文件及相关安全操作指南
  • day012
  • 怎么能把一个横着的很长的excel表,输出成一个能完整展示在一个页面中的PDF
  • agent技术框架
  • agent策略分析与Parer解读
  • 夸克网盘免费扩容,新用户轻松领取1TB免费空间!一步一步教你如何操作! - 详解
  • Visual Studio 2022连接mysql数据库,解决System.Data.Odbc.OdbcException (0x80131937)
  • [AI生成]Spark-TTS个人理解
  • 2025.10.3 测试
  • [20251015]建立和完善col_vlist.sql脚本.txt
  • [20251014]建立完善通用的prx.sql脚本.txt
  • 倍增法
  • 征程 6 | BPU trace 简介与实操
  • 实验任务2
  • 牛客2025秋季算法编程训练联赛1
  • 2025 年风淋室厂家选哪家?广州灵洁凭技术专利与全链服务打造净化设备优质之选
  • 251015读书报告
  • JAVA8 map flatmap用法
  • Spring bean初始化过程
  • 吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础 课后习题和代码实践
  • 【Windows】如何管理电脑磁盘文件,保持简洁 - 教程
  • 范围综述
  • CSP-S模拟30
  • 2025多校冲刺CSP模拟赛5
  • 应用安全 --- 安卓神器 之 入口加密
  • float
  • 读书报告和代码