0%

C++的三种传值方式

传值/按值传递

值传递:

形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
using namespace std;
void change1(int a)
{
cout<<"The initial value in the function is:"<<a<<endl;
a=5;
cout<<"The final value in the function is:"<<a<<endl;

}
int main()
{
int a=4;
cout<<"The initial value is:"<<a<<endl;;
change1(a);
cout<<"The final value is:"<<a<<endl;
return 0;
}

传地址/按地址传递/指针传递

指针传递:

形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作,可以改变实参的值。其实质是传参,只不过这里的参数是一个指针。这里的指针比较特殊,可以当作参数使用。若将change2函数里的代码拿到main里面,却不能执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
using namespace std;
void change2(int *a)//传地址/按地址传递
{
cout << "The initial value in the function is:" << *a << endl;
cout << "The initial address in the function is:" << a << endl;
*a = 3;
cout << "The final value in the function is:" << *a << endl;
cout << "The final address in the function is:" << a << endl;
}
int main()
{
int a=4;
cout<<"The initial value is:"<<a<<endl;
cout<<"The initial address is:"<<&a<<endl;
cout<<endl;
change2(&a);
cout<<endl;
cout<<"The final value is:"<<a<<endl;
cout<<"The final address is:"<<&a<<endl;
return 0;
}

错误示例

1
2
3
4
5
6
7
8
9
#include<iostream>
using namespace std;
int main()
{
int *a;
*a=5;
cout<<*a;
return 0;//执行完之后,返回结果为空
}

正确用法

1
2
3
4
5
6
7
8
9
10
#include<iostream>
using namespace std;
int main()
{
int *a;
int b=5;
a=&b;
cout<<*a;
return 0;
}

传引用/按引用传递

引用传递:

形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
void change3(int &a)
{
cout<<"The initial value in the function is:"<<a<<endl;
a=5;
cout<<"The final value in the function is:"<<a<<endl;
}
int main()
{
int a=4;
cout<<"The initial value is:"<<a<<endl;
change3(a);
cout<<"The final value is:"<<a<<endl;
return 0;
}