当前位置: 首页 > 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.hskmm.com/?act=detail&tid=31885

相关文章:

  • ROUGE指标
  • CSP-S 模拟 29
  • Linux 文件及相关安全操作指南
  • day012
  • 怎么能把一个横着的很长的excel表,输出成一个能完整展示在一个页面中的PDF
  • 高精度
  • 深入解析:Leetcode+Java+图论+岛屿问题
  • 简单介绍
  • agent技术框架
  • agent认知与原理分析
  • agent策略分析与Parer解读
  • Visual Studio 2022连接mysql数据库,解决System.Data.Odbc.OdbcException (0x80131937)
  • day05
  • [AI生成]Spark-TTS个人理解
  • 2025.10.3 测试
  • [20251015]建立和完善col_vlist.sql脚本.txt
  • [20251014]建立和完善col_list.sql脚本.txt
  • [20251014]建立完善通用的prx.sql脚本.txt
  • 倍增法
  • 复杂版式与印章干扰下的高精度社会团体法人登记证书识别技术
  • 征程 6 | BPU trace 简介与实操
  • 2025年预应力千斤顶厂家最新权威推荐榜:批发采购、张拉设备、同步顶升系统专业供应商综合测评与选购指南
  • 2025.10.15训练记录
  • 利用Next.js中间件漏洞实现SSRF攻击与RCE
  • 三级医疗服务体系 (Three Tiers of Care)
  • 2025年瑕疵检测设备厂家最新推荐排行榜,表面瑕疵检测,薄膜瑕疵检测,铝箔瑕疵在线检测,外观瑕疵检测机公司推荐!
  • 2025年冷却塔厂家最新推荐排行榜:高效制冷与稳定性能之选!
  • 牛客2025秋季算法编程训练联赛1
  • 2025 年风淋室厂家选哪家?广州灵洁凭技术专利与全链服务打造净化设备优质之选
  • 251015读书报告