默认情况下,参数只能以值传递的方式给函数。
这句话的理解是,被传递到函数的只是变量的值,永远不会是变量本身。
下面来看一段示例代码:
#include <iostream>
void changeAge( int age, int newAge );
main()
{
int age = 24;
std::cout << "My age is " << age << "\n";
changeAge( age, age+1 );
std::cout << "Now my age is " << age << "\n";
}
void changeAge( int age, int newAge )
{
age = newAge;
std::cout << "In this , my age is " << age << "\n";
}
输出结果如下所示:
My age is 24
In this , my age is 25
Now my age is 24
可以看出, main函数中的age和changeAge中的age是不同的,虽说名字一样,但完全不一样。如果要通过changeAge来改变main函数的age中的话该如何修改呢?
绕开“值传递”问题的第一种方法是向函数传递变量的地址取代它的值。我们说C语言的强大,很大部分就在于它的灵活,而它的灵活很大部分就是可以利用指针进行委婉地修改。
想要获取某个变量的地址只需要在它前面加上一个“取地址”操作符(&)就可以了。
将上述程序修改如下:
#include <iostream>
void changeAge( int *age, int newAge );
// 如果想要实现计划功能,需要怎么改?
main()
{
int age = 24;
std::cout << "My age is " << age << "\n";
changeAge( &age, age+1 );
std::cout << "Now my age is " << age << "\n";
}
void changeAge( int *age, int newAge )
{
*age = newAge;
std::cout << "In this , my age is " << *age << "\n";
}
结果是:
My age is 24
In this , my age is 25
Now my age is 25
注意:如果传过去的是地址,在函数中必须要通过*进行对指针的解引用,除非你有其他的用途。
下面来看一下引用传递的概念。设想,如果事先知道某个函数的参数只能接受一个地址,能不能使用某种约定使得在调用该函数时不需要使用指针的语法呢?
于是乎,以引用传递方式传递输入方式的概念因此而产生了。其实他跟我们地址的传递是一样的,都是把地址传递给函数,但语法不同,更加容易使用了。
#include <iostream>
void swap( int &x, int &y );//声明,这里我要接受的是一个地址
main()
{
int x, y;
std::cout << "请输入两个不同的值:";
std::cin >> x >> y;
swap( x, y );
std::cout << "调换后输出:" << x << ' ' << y << "\n\n";
}
void swap( int &x, int &y )
{
int temp;
temp = x;
x = y;
y = temp;
}
未完待续……