欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

函数中参数传递的三种方式

程序员文章站 2022-05-18 15:30:15
...

函数中参数传递的三种方式

一般来说,函数中参数的传递有三种方法:最简单的值传递、稍微复杂的指针传递、很有用的引用传递。

1.值传递

让我们先看一个典型的例子:

#include<stdio.h>

void SwapTwoNum(int x, int y) {//写一个交换两个数字的函数
	int temp = x;
	x = y;
	y = temp;
}
int main() {
	int a = 1, b = 2;
	SwapTwoNum(a, b);//调用交换函数,欲交换a、b。
	printf("a=%d,\nb=%d", a, b);
	return 0;
}

运行结果为:

a=1
b=2

交换失败,这是为什么呢??
答案很简单,在调用SwapTwoNum()时,实参到形参的值传递发生了一些改变。首先,在调用函数过程中,相当于把实参a、b的值都复制了一份给了SwapTwoNum()使用,此时这个函数执行时,交换的是两个复制的值,并未对实参a、b有丝毫影响,所以a、b的值不会交换。

不过这不代表值传递没有用。我们在看一个例子:

#include<stdio.h>

int PlusOne(int x) {//构造一个给x的值加1的函数
	int y = ++x;
	return y;
}
int main() {
	int a = 1;
	int b = a;
	b=PlusOne(a);//调用PlusOne函数,给a加一,并将值返回给b.
	printf("b=%d", b);
	return 0;
}

结果如下:

b=2

这个显然成功了。同理,在调用PlusOne()过程中,先将实参a复制一份给PlusOne()使用(相当于int x ; x=a ;) 此时PlusOne( x),返回的y=x+1;故而成功的将值加一。

2.指针传递

指针传递也叫地址传递。它是通过指针把参数地址传给函数,对指针的操作实际上就是参数的操作。
让我们先看一个简单的例子:

#include<stdio.h>

void SwapTwoNum(int *x, int *y) {//通过指针传递参数
	int temp = *x;
	*x = *y;
	*y = temp;
}
int main() {
	int a = 1, b = 2;
	SwapTwoNum(&a, &b);//&为在这里是取址操作符
	printf("a=%d,\nb=%d", a, b);
}

结果如下:

a=2
b=1

这时候有人就会有疑问了,为什么通过值传递失败了,指针成功了呢?
原因是:虽然在调用SwapTwoNum()时,发生了复制,但复制的是指针,指针还是指向a、b的,故而,通过指针去改变或者交换变量,就相当于直接交换原来的变量a、b。
当然,指针不仅可以指向数字,还可以指向函数和结构体变量

#include <iostream>
#include <string>
using namespace std;
struct Student
{
	string name; 
	string sex;
	int age;
	int score;
}stu = {"阿凡","男",18, 100 }; 

void print(Student* p)//函数声明,形参为指向Student类型数据的指针变量
{
	cout << p->name << "\n" << p->sex << "\n" << p->age << "\n" <<
		p->score << endl;
}
int main()
{
	
	Student* x;//定义一个结构体类型的指针
	x= &stu;   //给指针赋值
	print(x); //通过指针传递结构体参数
	return 0;
}

结果如下:

阿凡
男
18
100

指针其实还是比较复杂的,我后续会做一个关于指针的专题,小伙伴们可以参考我的其他文章。

3.引用传递

引用传递要用到&。注意这里的&可不是取址符号。
例如:

#include<stdio.h>
int main() {
	int x = 1;
	int& rx = x;
	rx++;
	printf("x=%d", x);
}

输出如下:

x=2

上面代码中 int& rx = x;相当于给x起个别名rx, 这就相当于人的小名,其中的&并不是取址符号,而是代表着引用。修改了rx本质就是修改x。这就是引用。
那我们怎么利用引用传递参数呢?
我们再看一个简单的例子:

#include<stdio.h>  
void SwapTwoNum(int& x, int& y){
	    int temp;
	    temp = x;
	     x = y;
	     y = temp;
 }

 int main(){
	     int a = 1, b = 2;
	     SwapTwoNum(a, b);
	     printf("a=%d\nb=%d", a, b);
	     return 0;
 }

结果如下:

a=2
b=1

在调用SwapTwoNum(a, b)时,可以这么理解,首先int& x = a, int& y = b;(给a,b起了别名x,y,然后SwapTwoNum(a, b)函数通过修改别名x,y来改变a,b的值。

总结:

我用的都是最简单的例子,就是希望帮助大家理解其本质。当然在使用的过程中会遇到各种各样的问题,大家多多练习,应该问题不大。我后续也会找一些不容易理解的知识点,给大家整理出来。