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

一、指针传递

在C++中,使用指针作为函数参数的主要目的是为了传递大型数据结构或者允许函数修改调用者的变量。这样做可以避免在函数中复制大型数据结构,从而提高效率。另外,使用指针还可以使函数修改传入的指针本身,使其指向不同的地址或对象。

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

  • 变量:int a = 0; int *b = 0;
  • 函数原型:void func(int *arg);
  • 传参形式:func(&a); func(b);//函数调用时实参传入的是地址

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

在C语言中,以指针作为函数的形参有三个作用:

①使实参与形参指针指向共同的内存空间,以达到参数双向传递的目的,即通过在被调函数中直接处理主调函数中的数据而将函数的处理结果返回其调用者。这个作用在C++中已经通过引用实现了。

②减少函数调用时数据传递的开销。这一作用在C++中有时可以通过引用实现,有时还是需要使用指针。

③通过指向函数的指针传递函数代码的首地址。

习惯上,如果函数体中不需要通过指针改变指针所指向对象的内容,应该在参数表中将其声明为指向常量的指针,这样使得常对象被取地址后也可以作为该函数的参数。

在程序设计中,当某个函数中以指针或引用作为参数都可以达到同样的目的时,使用引用会使程序可读性更好。

void fun(float x, int* ip, float* fp)
{
	*ip = static_cast<int>(x);//取x的整数部分
	*fp = x - *ip;//取x的小数部分
}

int main()
{
	cout << "输入3个浮点数:" << endl;
	for (int i = 0; i < 3; i++)
	{
		float x,f;
		int n;
		cin >> x;
		fun(x, &n, &f); //实参传入的是地址
		cout <<"第"<<i+1<<"个数的整数部分:" << n << "    小数部分:" << f << endl;
	}
	return 0;
}

输出:

结果分析:
程序中的fun函数采用了两个指针变量作为参数,主函数在调用过程中使用变量的地址作为实参。形实结合时,子函数的ip值就是主函数中的int型变量n的地址。因此,子函数中改变*ip的值,其结果也会直接影响主函数中变量n的值。fp和浮点数f也有类似的关系。

二、引用传递

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

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

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

void fun(float x, int& ip, float& fp)
{
	ip = static_cast<int>(x);//取x的整数部分
	fp = x - ip;//取x的小数部分
}

int main()
{
	cout << "输入3个浮点数:" << endl;
	for (int i = 0; i < 3; i++)
	{
		float x,f;
		int n;
		cin >> x;
		fun(x, n, f);
		cout <<"第"<<i+1<<"个数的整数部分:" << n << "    小数部分:" << f << endl;
	}
	return 0;
}

输出:

三、值传递

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

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

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

总结:

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

参考:

1、C++ 指针作为函数参数_c++ 函数指针作为参数-CSDN博客 

2、C++函数三种传参形式(指针传递、引用传递、值传递)_C 语言_脚本之家

在 C 语言中,函数传参的方式有三种值传递(call by value)、引用传递(call by reference)和指针传递值传递是最常见的传参方式,它会将实参的值复制一份给形参,在函数调用过程中,实参的值不会改变。编译器在函数调用时会将实参的值通过栈传递函数中,并为参数分配内存空间,函数对参数的修改不会影响到实参。这种方式适用于基本数据类型的参数传递,例如整数、浮点数等,以及结构体或对象的参数传递引用传递是通过指针间接访问实参的值,使得函数中对参数的修改能够影响到实参。编译器在函数调用时会将实参的地址传递给形参,在函数内部通过指针间接访问实参的值。这种方式适用于需要修改实参值的情况,例如交换两个变量的值或者修改数组元素等。 指针传递引用传递类似,通过指针传递参数。编译器在函数调用时会将指针值传递给形参,使得函数能够通过指针来访问实参的值。这种方式适用于需要修改实参值或者函数返回多个值的情况,例如动态内存分配、链表操作等。 这三种传参方式的选择取决于函数的需求和实参的特点。一般来说,如果函数中不需要修改实参的值,可以使用值传递;如果函数需要修改实参的值,可以使用引用传递指针传递。其中,引用传递可以简化对指针的操作,但同时也增加了代码的复杂性,而指针传递需要谨慎处理指针的空指针问题。因此,在选择传参方式时需要考虑函数的功能需求、实参的特点以及代码的复杂性和可读性等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值