首页 > 其他分享 >值传递、引用传递、指针传递【函数的参数传递】详解

值传递、引用传递、指针传递【函数的参数传递】详解

时间:2024-09-24 22:48:25浏览次数:3  
标签:参数传递 形参 int 传递 详解 func 实参 指针

形参变量:
形参变量是功能函数里的变量,只有在被调用的时候才分配内存单元,调用结束后立即释放。所以形参只在函数内部有效。
实参变量:
实参可以是常量,变量,表达式,函数等等,但无论是何类型,在进行函数调用是,他们必须有确定的值,以便把这些值拷贝给形参。

值传递、引用传递和指针传递在函数调用时处理参数的方式有所不同

值传递

值传递是指在调用函数时,将实际参数的值复制一份传递给函数的形式参数(拷贝副本)。值调用传递的是变量的副本,在函数内部对形参的任何修改都不会影响到实参。

void func(int a)

  • 单向性:值传递是单向的,只能从实参传递到形参
  • 独立性:形参和实参是两个独立的变量,它们在内存中占据不同的空间
  • 不改变实参:在函数内部对形参的修改不会影响到实参的值

示例

#include <iostream>
using namespace std;

void func(int a) {
    a = 10; // 修改的是局部变量
}

int main() {
    int x = 5;
    func(x);
    cout << x; // 输出: 5
}

引用传递

引用传递是指在调用函数时,将实际参数的地址(引用)传递给函数的形式参数。函数内部对形参的修改会影响到实参。

函数参数声明为引用(使用 & 符号),则为引用传递        void func(int& a)

示例

#include <iostream>
using namespace std;

void func(int& a) {
    a = 10; // 修改外部变量
}

int main() {
    int x = 5;
    func(x);
    cout << x; // 输出: 10
}

声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象,被初始化后,就不能改为指向其它对象

特点

  • 双向性:引用传递是双向的,形参和实参之间是直接关联的。
  • 共享性:形参和实参共享同一内存地址,修改形参会直接影响实参
  • 可能改变实参:在函数内部对形参的修改会影响到实参的值。

不太懂引用的可以看一下这篇文章

C++中的引用——引用详解-CSDN博客


指针传递

指针传递实际上是一种特殊的值传递,它传递的是实际参数(变量的地址)的值给形式参数(指针变量)。虽然从表面上看是传递了地址,但实际上传递的是地址的值

引用实际上是变量的别名。传递参数的地址,函数可以通过指针直接操作原始数据。

通过解引用指针,可以修改原始变量的值。

函数参数声明为指针(使用 * 符号),则为指针传递        void func(int* a)

示例 

#include <iostream>
using namespace std;

void func(int* a) 
{
    *a = 10; // 通过指针修改外部变量
}

int main() {
    int x = 5;


    func(&x); // 传递 x 的地址
    cout << x; // 输出: 10
}

特点:

  • 双向性:指针传递也是双向的,通过指针可以访问和修改实参
  • 地址传递:传递的是实参的地址,允许在函数内直接操作外部变量
  • 可能改变实参:在函数内部通过指针修改的值会影响到实参

应用场景:值传递适用于保护原始数据不被修改的场景;引用传递适用于需要修改原始数据且节省空间的场景;指针传递则提供了更高的灵活性和直接访问内存的能力

标签:参数传递,形参,int,传递,详解,func,实参,指针
From: https://blog.csdn.net/Z15922342915/article/details/142500314

相关文章

  • PasteForm最佳CRUD实践,实际案例PasteTemplate详解(一)
    本文将介绍soft.pastecode.cn出品的PasteForm,PasteForm是贴代码使用Dto思想实现的CRUD的一个组件,或者说输出一个思想!为啥我觉得是最佳的CRUD呢?先结合你的实际项目解答下以下问题:1.如果有一个系统,有100个表,你的管理端需要多少页面?别和我说100个表很多,需求复杂点的随随便便上100个......
  • Linux6.8最新版本x86路径下分页管理源码详解
    x86路径下分页管理源码详解pgtable_64.h分析:pgtable-2level.h分析pgtable-3level.h分析x86的asm文件夹路径为/usr/src/linux-headers-6.8.0-45-generic/arch/x86/include/asm,是x86体系架构下的文件,本次分析了pgtable_64.h,pgtable-2level.h和pgtable-3level.h......
  • Vue修改全局样式 v-style指令详解
    Vue修改全局样式v-style指令详解基本概念与作用基础用法示例一:动态修改单个元素的样式示例二:使用计算属性动态设置样式示例三:全局样式动态化示例四:使用Vue生命周期钩子设置样式示例五:通过Vuex管理全局样式实际开发中的使用技巧在Vue.js的开发过程中,有时我们......
  • 基于旗芯微FC4150系列的DMA详解
    1.概述DMA的中文名称是直接内存访问,它不需要CPU的参与,实现数据传输的技术(但是也会占用总线带宽,所以有时候使用DMA虽然会降低CPU负载,但提高访问数据速度并不高)。1.1旗芯微FC4150系列芯片DMA特征·所有数据的传输都是从源地址写入到目标地址,源地址和目标地址以及传输大小都是......
  • OSPF 默认路由的发布原则 | 类型详解
    默认路由默认路由是指目的地址和掩码都是0的路由。当设备无精确匹配的路由时,就可以通过默认路由进行报文转发。一般多用于网络边界路由器访问互联网所需要的一条路由。同时,企业内,在精确的内部路由基础上,边界路由器通告一条默认路由,使所有访问未知目的地的数据报文都送至......
  • 详解Linux中cat命令
    在Linux命令的世界中,cat命令就像是一位多才多艺的艺术家,它能够将文本文件的美妙旋律编织在一起,或者单独演奏它们的每一个音符。下面,让我们以一种充满情感的方式,用Markdown格式来探索cat命令的多种用途。1. 查看文件的诗篇当你想要阅读一个文件,就像阅读一首诗一样,你可以使用......
  • 大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(正在更新···)章节内容上节我们完成了如下的内容:MergeTree实测案例Re......
  • 大数据-138 - ClickHouse 集群 表引擎详解3 - MergeTree 存储结构 数据标记 分区 索引
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(正在更新···)章节内容上节我们完成了如下的内容:MergeTree存储结构Me......
  • 大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(正在更新···)章节内容上节我们完成了如下的内容:测试连接集群数据类型......
  • 详解机器学习经典模型(原理及应用)——KNN
    一、什么是KNN        K最近邻(K-NearestNeighbors,KNN)是一种简单而强大的机器学习算法,它基于一个基本的假设:相似的样本通常在特征空间中彼此接近。KNN算法通过查找一个样本的最近K个邻居来预测该样本的类别或属性。二、KNN算法流程        KNN没有显式的训......