当前位置: 首页 > 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 时修改的到底是谁

相关文章:

  • 当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--自动生成目录
  • 门户网站制度建设/青岛seo推广
  • 济南专业做网站/一键关键词优化
  • 我的世界做墙纸网站/河南郑州最新事件
  • 那个网站可以做全景图/进入百度官网首页
  • 吃的网站要怎么做/如何找做网站的公司
  • 如何做网站运营呢/百度竞价怎么做开户需要多少钱