函数的传值与传址
2019-09-15 12:13 艾伦爱尔敏 阅读(600) 评论(0) 编辑 收藏 举报在c++中函数参数的传递分为三种:传值、传址以及传引用,本帖主要介绍传值与传址的区别。
函数的传值
首先讨论函数的传值,顾名思义函数的传值仅仅是把实参的值传递给了形参的值,这也就是说实参与形参之间互不影响,仅仅因为函数的需要其值相同而已。在这里我们把它形象地想象成数学中一个函数f(x),而现在我们要求f(a),当我们运算完成后,a的值还是它原来的那个数,而我们的f(x)函数仍然可以继续做f(b)、f(c)等一系列运算,这里就可以将这种特质类推到c++语言中的函数利用函数过后会将其形参值释放掉的模式,我认为函数的设计初衷也是如此。
以上内容间接说明了函数传值并不能改变实参的值,下面我们用一个最常见的例子来说明此特质:
#include<iostream> using namespace std; void swap(int a, int b) { int x; x = a; a = b; b = x; cout << a << " " << b << endl; } int main() { int a = 1, b = 2; swap(a, b); cout << a << " " << b << endl; return 0; }
运行结果为:2 1
1 2
由此可看出交换函数swap并没有改变主函数中a与b的值。
函数的传址
由以上的例子表明,函数并不能做到更改主函数的值,所以人们就想到了利用地址来间接更改地址中的值,也就是所谓的函数的传址。
函数的传址就是主函数中的实参是一个地址变量,而相对应的被调用函数的形参也是一个地址变量(也就是指针变量)。这个变量中存着地址,可以在被调函数中对其所指向的地址中的数值进行更改,而如介绍传值时所说的调用结束后会释放形参,而传址的方式使得函数释放的不是指针指向的值而是指针本身。所以c++通过这种函数传递方式来完成对主函数中的值的改变。
下面用例子更加直观地描述:
#include<iostream> using namespace std; void swap(int *a, int *b) { int x; x = *a; *a = *b; *b = x; cout << *a << " " << *b << endl; } int main() { int *a, *b, c = 1, d = 2; a = &c; b = &d; swap(a, b); cout << *a << " " << *b << endl; return 0; }
注意:在c++中,如果想在函数中更改某个指针的值,参数是指针是做不到更改其值的,应使用指针的指针来进行更改。因为参数传递的本质仍然是传值。