C/C++:函数参数传递的三种情况【传值(a):不能改变实参】【传地址(*a)(本质还是传值):可改变实参】、【传引用(&a):可改变实参】

本文详细介绍了C/C++中函数参数传递的三种方式:传值、传地址和传引用。通过对比分析,阐述了各种方式的特点和适用场景,并提供了代码实例来说明它们在普通类型、指针类型和数组类型中的应用。传值会创建实参的副本,不改变原值;传地址通过指针改变实参;传引用直接操作实参,无额外拷贝,效率更高。
摘要由CSDN通过智能技术生成

一、函数参数传递方式-概述

C++的函数参数传递方式,可以是传值方式,也可以是传引用方式。

  • 传值的本质是:形参是实参的一份复制。
  • 传引用的本质是:形参和实参是同一个东西。

传值传引用,对大多数常见类型都是适用的。

如果希望通过将参数传递到函数中,从而来改变变量的值(比如变量是T a,T表示类型),则可以有这2种方式选择:

  1. 传 a 的引用: void my_fun(T &a);
  2. 传 a的地址: void my_fun(T *a);

1、普通类型

  • 传值(复制产生新的变量)
    void fun_1(int a); int类型,传值(复制产生新的变量)
    
  • 传引用(形参和实参是同一个东西)
    void fun_2(int &a); int类型,传引用(形参和实参是同一个东西)
    

2、指针、数组

指针、数组,它们都是数据类型的一种,没啥特殊的,因此指针作为函数参数传递时,也区分为传值和传引用两种方式。

  • 指针类型,传值(复制产生新的变量)
    void fun_3(int* p); 指针类型,传值(复制产生新的变量)
    
  • 指针类型,传引用(形参和实参是同一个东西)
    void fun_4(int* &p); 指针类型,传引用(形参和实参是同一个东西)
    

二、函数参数传递方式-对比

1、传值

这种传递方式中,实参和形参是两个不同的地址空间,参数传递的实质是将原函数中变量的值,复制到被调用函数形参所在的存储空间中,这个形参的地址空间在函数执行完毕后,会被回收掉。整个被调用函数对形参的操作,只影响形参对应的地址空间,不影响原函数中变量的值,因为这两个不是同一个存储空间。
即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。

2、传地址

这种传递方式中,实参是变量的地址,形参是指针类型的变量,在函数中对指针变量的操作,就是对实参(变量地址)所对应的变量的操作,函数调用结束后,原函数中的变量的值将会发生改变。
被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。

3、传引用

这种传递方式中,形参是引用类型变量,其实就是实参的一个别名,在被调用函数中,对引用变量的所有操作等价于对实参的操作。这样,整个函数执行完毕后,原先的实参的值将会发生改变。

被调函数对形参做的任何操作都影响了主调函数中的实参变量。

使用引用类型就不必在swap中声明形参是指针变量,指针变量要另外开辟内存单元,其内容是地址。

而引用变量不是一个独立的变量,不单独占内存单元。而且在调用swap函数时,只需要传值即可,将引用作为函数的形参更加简单、直观、方便。

void swap(int &a, int &b)
{
   
    int temp = a;                                                           
    a = b;                                   
    b = temp;
}

4、哪种更高效?

在内置类型当中三种传递方式的效率上都差不多;

在自定义类型当中,传引用方式效率的更高效一些,因为它没有对形参进行一次拷贝

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//值传递
void mySwap(int a, int b)
{
   
	int tmp = a;
	a = b;
	b = tmp;

	cout << "mySwap::a = " << a << endl;
	cout << "mySwap::b = " << b << endl;
}

void test01()
{
   
	int a = 10;
	int b = 20;
	mySwap(a, b);

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}


//地址传递
void mySwap2(int * a, int * b)
{
   
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
void test02()
{
   
	int a = 10;
	int b = 20;
	mySwap2(&a, &b); 

	cout << "a = " << a << endl;
	cout << "b = " << b << endl
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值