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

指针、空间地址

编写一个功能函数,让一个变量增加10

  1. 编写函数 add10_value,形参是 int x

  2. 在函数内部对 x 加 10 并输出

  3. 在 main 中调用后再输出原变量,观察差异

参考代码

#include <iostream>
using namespace std;
​
void add10_value(int x) {x += 10;cout << "inside add10_value, x = " << x << endl;
}
​
int main() {int n = 5;add10_value(n);cout << "after add10_value, n = " << n << endl;  // 依旧是 5return 0;
}

关键现象:add10_value 得到的是 n 的副本,副本改了,原变量还是 5。


二、地址传递:指向同一块内存

  1. 改写为 add10_ptr,形参是 int* p

  2. 在函数里 *p += 10;

  3. 主函数传入 &n,观察变化

参考代码

#include <iostream>
using namespace std;
​
void add10_ptr(int* p) {*p += 10;                        // 解引用,对真实内存写入cout << "inside add10_ptr, *p = " << *p << endl;
}
​
int main() {int n = 5;int* m = &n;add10_ptr(m);cout << "after add10_ptr, n = " << n << endl;    // 变成 15return 0;
}

为什么能改掉?因为 p 保存的就是 n 的地址,同一块空间。


三、* 与 & 的含义

*(解引用):根据地址找到对应的空间 & (取地址):把空间的地址取出来

小结 int a = 5; // a 是 5 int* p = &a; // p 存的是 a 的地址 *p = 8; // 在地址处写 8,a 立刻变 8


四、多重指针:内存里再存一张门牌号 概念 指针本质也是变量,也住在一块内存。如果我们想操作“指针自身指向哪里”,就需要再保存一次它的地址——这就是指针的指针。

任务

  1. 写函数 reset_zero(int** pp),让它把 **pp 置 0

  2. 主函数里先让 p 指向 n,再把 &p 传进去

  3. 输出验证

参考代码

#include <iostream>
using namespace std;
​
void reset_zero(int** pp) {**pp = 0;                          // 找到最深层的 int 并清零
}
​
int main() {int n = 42;int* p = &n;reset_zero(&p);                    // &p 是指向指针的指针cout << "after reset_zero, n = " << n << endl;   // 输出 0return 0;
}

过程剖析 pp 里保存的是 p 的地址 *pp 取得 p 本身(即保存着 n 地址的那块内存) **pp 跳两次,最终落到 n 所在的真实位置


练习延伸

  1. 写 swap_ptrs(int* p1, int* p2),交换两个指针的指向

  2. 验证指针交换是否成功

  3. 写 swap_ptrs(int** p3, int** p4),交换两个指针的指向

  4. 验证指针交换是否成功

  5. 思考当 p1、p2、p3、p4 时修改的到底是谁

http://www.dtcms.com/a/212264.html

相关文章:

  • 当NLP能模仿人类写作:原创性重构而非终结
  • 华为OD机试真题—— 货币单位换算(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 佳源科技退卷IPO:曾于2023年7月过会,原计划募资约9亿元
  • CAPL自动化-诊断Demo工程
  • 达梦数据库-学习-23-获取执行计划的N种方法
  • Leetcode 587. 安装栅栏
  • 针对面试- RabbitMQ消息队列篇
  • 基础编程题目集 7-1 厘米换算英尺英寸
  • java基础(面向对象高级部分)
  • 快速扩容VHD文件的DiskPart命令指南
  • 临床研究统计分析核心概念解析
  • 【AI智能体】Spring AI Tool 从使用到实战详解
  • day28JS+Node-JS打包工具Webpack
  • multiprocessing多进程使用案例
  • 使用Python,OpenCV,Tesseract-OCR对自己的运动数据图片进行识别及分析,并使用Matplotlib绘制配速图出来
  • 【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter3 项目实践 -1 项目功能描述
  • 机器学习---特征降维
  • 运维Linux之Ansible详解学习(更新中)
  • Python应用运算符初解
  • Word转PDF--自动生成目录
  • 如何在uniapp H5中实现路由守卫
  • 【Vue3】(二)vue3语法详解:自定义泛型、生命周期、Hooks、路由
  • Linux C学习路线全概及知识点笔记1(仅供个人参考)
  • 【2025】基于Springboot + vue + 协同过滤算法实现的旅游推荐系统
  • 基于RK3576+FPGA+CODESYS工控板的运动控制模块方案
  • # 探索自然语言处理的奥秘:基于 Qwen 模型的文本分类与对话系统实现
  • 星际旅行家(广度优先搜索+邻接表)
  • 通俗理解线性与非线性、时变与时不变系统,和数值不稳定性机制
  • 使用Java制作贪吃蛇小游戏
  • PCB文件从 Allegro 24.1 降级保存为 Allegro 17.4版本格式