C++函数三种传参形式(指针传递、引用传递、值传递)

 更新时间:2024年03月19日 10:07:22   作者:学不会2233  
不论是哪种参数传递方式,都有形参和实参之分,本文主要介绍了C++函数三种传参形式(指针传递、引用传递、值传递),具有一定的参考价值,感兴趣的可以了解一下

前言

不论是哪种参数传递方式,都有形参和实参之分,都会在调用函数时进行一次复制,将实参的值赋予形参。对于值传递,实参形参概念较好区分,但对于地址传递,形参实参指向的地址相同,可能会产生操作的是同一变量的想法,实则不然。(这也是理解二级指针作用的核心知识点)

指针传递

变量形式、函数原型及对应传参形式:

  • 变量:int a = 0; int *b = 0;
  • 函数原型:void func(int *arg);
  • 传参形式:func(&a); func(b);

解释:

函数得参数类型是int指针类型,接受的参数的一个地址。因此,对于普通变量a,需要先用&符号取地址后传入,故传入&a。对于指针b,指针就是地址,因此直接传入b即可。

#include <iostream>
using namespace std;
void exchange(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
 
int main()
{
	int x, y;
	cin >> x >> y;
	exchange(&x, &y);
	cout << x << y;
}

引用传递

最复杂的是引用传递。此次只讲解最基础简单的使用。

变量形式、函数原型及对于传参形式:

  • 变量:int a = 0; int *b = 0;
  • 函数原型:void func(int &arg);
  • 传参形式:func(a); func(b);func(*b)

解释:

函数的参数类型是引用类型。对于变量a,直接传入a。对于指针b,可以选择传入地址b或者传入b指向的值*b。

区别:待定

引用的本质:待定

#include <iostream>
using namespace std;
void exchange(int &a, int &b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
 
int main()
{
	int x, y;
	cin >> x >> y;
	exchange(x, y);
	cout << x << " " << y;
}

值传递

变量形式、函数原型及对应传参形式:

  • 变量:int a = 0; int *b = 0;
  • 函数原型:void func(int arg);
  • 传参形式:func(a); func(*b);

解释:

函数的参数类型是int类型,接收的值是int型变量的值。因此,对于变量a,本身就是int型变量,故直接传入。对于指针变量b,是需要用*符号进行解引用获取指针指向的值,故传入*b。

#include <iostream>
using namespace std;
void exchange(int a, int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
 
int main()
{
	int x, y;
	cin >> x >> y;
	exchange(x, y);
	cout << x << " " << y;
}

总结:

1.引用传递和值传递都是传地址,可理解为实参和形参的内存地址相同,在函数中的赋值操作在函数结束后仍会保留(只要被赋值的变量仍存在)。而值传递传入的是实参的值,调用函数时会进行拷贝操作将实参的值赋予形参,实参和形参的地址不同,因此在函数体内对形参的赋值操作不会改变实参的值。

到此这篇关于C++函数三种传参形式(指针传递、引用传递、值传递)的文章就介绍到这了,更多相关C++函数传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++基于Boost.Asio实现端口映射器的过程详解

    C++基于Boost.Asio实现端口映射器的过程详解

    Boost.Asio 是一个功能强大的 C++ 库,用于异步编程和网络编程,它提供了跨平台的异步 I/O 操作,在这篇文章中,我们将深入分析一个使用 Boost.Asio 实现的简单端口映射服务器,文中有详细的代码讲解,需要的朋友可以参考下
    2023-11-11
  • 详解C++ const修饰符

    详解C++ const修饰符

    const 是 constant 的缩写,const可以帮我们避免无意之中的错误操作,本文给大家介绍C++ const修饰符的相关知识,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-05-05
  • C++11 <future>中std::promise 介绍

    C++11 <future>中std::promise 介绍

    这篇文章主要介绍了C++11 <future>中std::promise 介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C语言实现的一个万年历小程序

    C语言实现的一个万年历小程序

    这篇文章主要介绍了C语言实现的一个万年历小程序,具有一定的参考价值,做C语言日期计算的朋友可以参考下
    2014-07-07
  • C++11新特性std::tuple的使用方法

    C++11新特性std::tuple的使用方法

    这篇文章主要介绍了C++11新特性-std::tuple的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • C及C++中typedef的简单使用介绍

    C及C++中typedef的简单使用介绍

    C/C++中关键字typedef的理解不是多透彻,今天小编抽空给大家分享下C及C++中typedef的简单使用介绍,需要的朋友可以参考下
    2016-10-10
  • C语言结构体指针引用详解

    C语言结构体指针引用详解

    C语言中结构体指针,可细分为指向结构体变量的指针和指向结构体数组的指针。本文将详细为大家介绍一下这两种结构体指针如何引用,需要的小伙伴可以参考一下
    2021-12-12
  • C++中输出十六进制形式的字符串

    C++中输出十六进制形式的字符串

    这篇文章主要给大家介绍了C++中输出十六进制形式的字符串,文中给出了详细的介绍,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • C语言数组任意位置插入一个元素方法

    C语言数组任意位置插入一个元素方法

    这篇文章主要给大家分享C语言数组任意位置插入一个元素方法,
    2021-11-11
  • C++通过ofstream和ifstream实现文件读写

    C++通过ofstream和ifstream实现文件读写

    本文详细介绍了C++中通过ofstream和ifstream进行文件的读写操作,包括文件打开模式的选择、错误处理策略以及二进制文件的特殊处理,重点讲解了如何使用这些类进行文本和二进制文件的读写,并强调了正确处理文件操作中可能出现的错误,需要的朋友可以参考下
    2025-03-03

最新评论