传值很简单,略过,我们重点来学习一下向函数里传指针和传引用。
传指针
向函数传递参数的指针调用方法,把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
#include <iostream>
using namespace std;
void swap(int *x, int *y);
int main() {
int a = 10;
int b = 20;
swap(&a, &b);
return 0;
}
void swap(int *x, int *y) {
int temp;
temp = *x;
cout << "temp:" << temp << endl;
*x = *y;
cout << "x:" << x << endl
<< "*x:" << *x << endl;
*y = temp;
cout << "y:" << y << endl
<< "*y:" << *y << endl;
}
输出:
temp:10
x:0x63fe1c
*x:20
y:0x63fe18
*y:10
通过上述程序,我们能够发现,指针之间相互传递,通过*x=*y方式传递。
再来看一下传指针副本而不改变实参的sample
#include <iostream>
using namespace std;
void swap(int *x, int *y);
int main() {
int a = 10;
int b = 20;
swap(&a, &b);
cout << "a:" << a << endl;
cout << "b:" << b << endl;
return 0;
}
void swap(int *x, int *y) {
int *temp;
temp = x;
cout << "temp:" << temp << endl;
x = y;
cout << "x:" << x << endl;
y = temp;
cout << "y:" << y << endl;
}
输出:
temp:0x63fe1c
x:0x63fe18
y:0x63fe1c
a:10
b:20
可以看到因为传递的是指针的副本,所以并没有改变实参的值,故没有产生交换。
传引用
向函数传递参数的引用调用方法,把引用的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数
#include <iostream>
using namespace std;
void swap(int &x, int &y);
int main() {
int a = 10;
int b = 20;
swap(a, b);
cout << "a:" << a << endl;
cout << "b:" << b << endl;
return 0;
}
void swap(int &x, int &y) {
int temp;
temp = x;
cout << "temp:" << temp << endl;
x = y;
cout << "x:" << x << endl;
y = temp;
cout << "y:" << y << endl;
}
输出:
temp:10
x:20
y:10
a:20
b:10
传地址可以直接对实参进行改变。