函数中参数传递的三种方式
一般来说,函数中参数的传递有三种方法:最简单的值传递、稍微复杂的指针传递、很有用的引用传递。
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的值。
总结:
我用的都是最简单的例子,就是希望帮助大家理解其本质。当然在使用的过程中会遇到各种各样的问题,大家多多练习,应该问题不大。我后续也会找一些不容易理解的知识点,给大家整理出来。