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

来自:网络
时间:2024-06-09
阅读:

前言

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

指针传递

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

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

返回顶部
顶部