当前位置: 首页 > 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.zskr.cn/news/21869.html

相关文章:

  • ROUGE指标
  • day012
  • agent认知与原理分析
  • 2025.10.3 测试
  • [20251015]建立和完善col_vlist.sql脚本.txt
  • 2025年预应力千斤顶厂家最新权威推荐榜:批发采购、张拉设备、同步顶升系统专业供应商综合测评与选购指南
  • 2025.10.15训练记录
  • 牛客2025秋季算法编程训练联赛1
  • 50系显卡配置运行sovits4.1的完整步骤(so-vits-svc)
  • JAVA8 map flatmap用法
  • float
  • 《程序员的修炼之道:从小工到专家》阅读笔记
  • 关于Pytorch深度学习神经网络的读书报告
  • 牛客刷题-Day13
  • 二分图、拓扑与欧拉
  • 每日笔记
  • 实用指南:2025年9月个人工作生活总结
  • 别再用均值填充了!MICE算法教你正确处理缺失数据
  • nginx-1.16.1-2.p01.ky10.sw_64.rpm 安装教程(详细步骤,适用于Kylin V10/申威SW64架构)
  • 感知节点@5@ ESP32+arduino+ 第三个程序FreeRTOS 上 LED灯显示 和 串口打印ASCII表
  • BIG-Bench:大规模语言模型能力的全面评估与挑战 - 详解
  • OAuth/OpenID Connect 渗透测试完全指南
  • Problem K. 置换环(The ICPC online 2025)思路解析 - tsunchi
  • Go 语言和 Tesseract OCR 识别英文数字验证码
  • 2025年10月小程序开发公司最新推荐排行榜,小程序定制开发,电商小程序开发,预订服务小程序开发,活动报名小程序开发!
  • C语言学习——键盘录入
  • 第十五篇
  • Erlang 的英文数字验证码识别系统设计与实现
  • 使用Django从零开始构建一个个人博客系统 - 实践
  • 2025年磨床厂家TOP企业品牌推荐排行榜,平面磨床,外圆磨床,数控平面磨床,数控外圆磨床,7163平面磨床推荐这十家公司!