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

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

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

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的值。

总结:

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

    原文作者:I`m Vandow
    原文地址: https://blog.csdn.net/qq_44645062/article/details/106928182
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞