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++ 复制控制之复制构造函数的实现

    C++ 复制控制之复制构造函数的实现

    所谓的“复制控制”即通过这三个成员函数控制对象复制的过程,本文主要介绍了C++ 复制控制之复制构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • c++ 构造函数的初始化列表

    c++ 构造函数的初始化列表

    构造函数的初始化列表仅仅指定用于初始化成员的值,并不指定这些初始化执行的次序。成员初始化的次序就是定义成员的次序,第一个成员首先被初始化,然后是第二个,依次类推
    2013-07-07
  • C++深入刨析类与对象的使用

    C++深入刨析类与对象的使用

    类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
    2022-05-05
  • 详解C语言数组越界及其避免方法

    详解C语言数组越界及其避免方法

    这篇文章主要介绍了详解C语言数组越界及其避免方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  •  C++模板template原理解析

     C++模板template原理解析

    这篇文章主要介绍了C++模板template原理,函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本
    2022-07-07
  • C语言动态内存管理介绍

    C语言动态内存管理介绍

    大家好,本篇文章主要讲的是C语言动态内存管理介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言实现一个多线程委托模型的示例详解

    C语言实现一个多线程委托模型的示例详解

    这篇文章主要介绍了C语言实现一个多线程委托模型,这就是一个使用C语言实现多线程委托模型的例子,其中包含boss线程和worker线程,可以处理工作线程的异常情况,需要的朋友可以参考下
    2023-06-06
  • C++11模板元编程-std::enable_if示例详解

    C++11模板元编程-std::enable_if示例详解

    这篇文章主要给大家介绍了关于C++11模板元编程-std::enable_if的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • java string对象上的操作,常见的用法你知道吗

    java string对象上的操作,常见的用法你知道吗

    今天给大家带来的是关于Java的相关知识,文章围绕着Java String类用法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-08-08
  • C++ STL中的容器适配器实现

    C++ STL中的容器适配器实现

    这篇文章主要介绍了C++ STL中的容器适配器实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论