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

【C/C++】 函数形参—指针传递

【C/C++】 函数形参—指针传递

🌈最近又复习了一下关于函数和指针传递的内容,现在再分享一下~

首先要了解一下函数传入参数的一个基本的过程。

🌞在 C 语言中,函数参数传递是值传递:形参是实参的副本,修改形参不会影响实参。 当需要在函数中访问另一个函数的数据时,可以把指针作为函数的参数,但如果参数是指针,函数内部可以通过指针解引用修改原变量的值

  • 值传递:函数里玩的是“复印件”。
  • 指针/引用:函数里玩的是“原件本身”。

下面用数值交换为例说明。

#include <iostream>
using namespace std;struct Solution {/*1. 指针传递 —— 真正交换 */void swap(int *a, int *b) {cout << "=== swap(int *a, int *b) ===\n";cout << "a 指向 " << a << "  b 指向 " << b << endl;int tmp = *a;*a = *b;*b = tmp;}/* 2. 值传递 —— 换了个寂寞 */void swap(int a, int b) {cout << "=== swap(int a, int b) 值传递 ===\n";cout << "形参 a 地址 " << &a << "  形参 b 地址 " << &b << endl;int tmp = a;a = b;b = tmp;}
};int main() {int a = 3, b = 44;Solution s;cout << "原始值  a=" << a << "  b=" << b << endl;cout << "它们地址 &a=" << &a << "  &b=" << &b << "\n\n";// 3. 值传递(失败)s.swap(a, b);cout << "值传递后  a=" << a << "  b=" << b << "\n\n";// 2. 指针传递(成功)s.swap(&a, &b);cout << "指针传递后  a=" << a << "  b=" << b << "\n\n";return 0;
}

下面是运行的结果

原始值  a=3  b=44
它们地址 &a=0x7ffeef2f69a8  &b=0x7ffeef2f69ac=== swap(int a, int b) 值传递 ===
形参 a 地址 0x7ffeef2f6998  形参 b 地址 0x7ffeef2f699c
值传递后  a=3  b=44=== swap(int *a, int *b) ===
a 指向 0x7ffeef2f69a8  b 指向 0x7ffeef2f69ac
指针传递后  a=44  b=3

传递模拟

main函数栈和 要跳转的函数栈是两个地方,函数传参的时候,会把main里面的变量的值在函数栈复制一份:1️⃣对于值传递而言,复制的是值本身;2️⃣对于指针传递而言,复制的是指针变量的值,也就是一个地址。

**在 C 语言中,函数参数传递是值传递:形参是实参的副本,修改形参不会影响实参。**也就是函数一旦结束运行,里面的变量都会被释放,所以修改形参不会影响实参。

那么为什么传入指针可以修改变量捏?在函数中访问另一个函数的数据时,可以把指针作为函数的参数,但如果参数是指针,函数内部可以通过指针解引用修改原变量的值

也就是通过操作指针变量的值,也就是地址,解引用修改原变量的值,这样就可以通过指针直接操作原变量的值,实现修改的目的。

A) 值传递版 void swap(int a, int b)
main 栈帧
+---------------+ 高地址
|  ……           |
|  int b = 44   | 0x7ffe6b4829ac   <─ 原件
|  int a = 3    | 0x7ffe6b4829a8   <─ 原件
+---------------+
|  ret addr     |
+---------------+
swap 栈帧
|  int b = 44(传入的是值 44)   | 0x7ffe6b48296c   <─ 副本(换的是它)
|  int a = 3 (传入的是值 3)   | 0x7ffe6b482968   <─ 副本
|  int tmp      |
+---------------+ 低地址→ 交换后只改副本,main 的 0x7ffe6b4829a8/0xac 纹丝不动。
B) 指针版 void swap(int *a, int *b)
main 栈帧
+---------------+
|  int b = 44   | 0x7ffe6b4829ac
|  int a = 3    | 0x7ffe6b4829a8
+---------------+
(传的是地址 可以通过这个地址更改原变量的值)
swap 栈帧
|  int *b 0x7ffe6b4829ac |  <─ 存的是 main.b 的地址
|  int *a 0x7ffe6b4829a8 |  <─ 存的是 main.a 的地址
|  int tmp               |
+---------------+→ 通过 *a / *b 直接改 0x7ffe6b4829a8 / 0xac 处的值,原件被换。

🌿 完结~

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

相关文章:

  • 门限签名与多方安全计算(MPC)
  • 东莞公司高端网站建设高大上网站
  • 基于websocket的多用户网页五子棋(一)
  • PCA 主成分分析:数据世界的 “旅行清单整理师”—— 从 30 维杂乱到 2 维清晰的诗意降维
  • wordpress兼容mipseo加盟代理
  • 台州网站排名优化费用网站建设设计风格描述
  • 利用 ZoneABC 免费域名 零成本接入 Cloudflare 企业版 CDN
  • 企业网站建设费用属于什么科目dw软件网站建设教程
  • Streamlit:基础入门——零基础搭建第一个 Web 应用
  • Netty粘包和半包问题产生的原因和解决方案
  • 【小沐学GIS】基于C++绘制地形DEM(OpenGL、Terrain、TIFF、hgt)第十二期
  • 怎么搭建本地网站外贸营销工具
  • MySQL常用命令全攻略
  • 郑州市网站和公众号建设长沙公积金网站怎么做异动
  • 平面设计有什么网站wordpress 汽车模板下载
  • 珠宝首饰网站开发郑州微盟网站建设公司
  • 网站建设毕业设计指导老师意见什么网站可以做设计
  • 想学做网站要去哪里学健身网站开发过程中遇到的麻烦
  • 网站建设方案设计书参考西安最新消息今天
  • 代做道具网站备案网站可以做论坛么
  • SnapTube v7.46.1.74675101 | 免登下载油管4K视频,支持上百个网站的视频和音乐下载
  • 图像AUROC和像素AUROC
  • 网站加载速度影响因素为什么不能自己做网站
  • 网站正在建设中 htmlwordpress开发手册中文
  • 开发手机应用网站竞价托管推广代运营
  • 【开题答辩全过程】以 zy旅游健身为例,包含答辩的问题和答案
  • 做淘宝详情页的素材网站资金盘网站开发价格
  • 网站建设可上传视频的怎么关闭seo综合查询
  • 贵州企业网站建设有什么做木工的网站
  • 商场应急预案管理系统|基于SpringBoot和Vue的大型商场应急预案管理系统(源码+数据库+文档)