6.4.1 把地址传递给函数(1)
绕开"值传递"问题的第一种办法是向函数传递变量的地址而不是它的值。正如你已经了解的那样,要想获得某个变量的地址,只要在它的名字前加上一个"取地址"操作符(&)就行了。于是,如果想把一个地址传递给某个函数,相应的函数调用语句应该是下面这样:
- int main() {
- int myNum = 20;
- changeVar(&myNum, 90);
-
现在,myNum变量的地址将被发送到函数并被赋值给那里的第一个输入参数。因为只有一种数据类型可以用来保存地址,所以第一个输入参数必须是一个指针。又因为指针的类型必须与由它保存其地址的变量的类型相一致,所以changeVar()函数的原型应该是:
- void changeVar(int *myVar, int newValue);
在函数里,当需要改变这个变量的值时,别忘了对指针进行解引用:
- void changeVar (int *myVar, int
- newValue) {
- *myVar = newValue;
- }
在用这段代码修改test程序之后,你将看到预期的结果(如图6-22所示)。
|
图6-22 把变量的地址(而不是它的值)传递给 changeVar()函数的做法让我们看到了预期的结果: 变量的值被改变了 |
同样的办法还可以用来解决另一类问题,接下来的示例程序将定义一个函数来交换两个变量的值。这种交换在很多排序算法里都要用到,它只能利用指针和地址来实现。
以"地址传递"方式把值传递给函数
1.在文本编辑器或IDE里创建一个空白的新文本文档(代码清单6-8)。
-
- #include <iostream>
代码清单6-8 这个程序定义了一个函数,该函数以两个变量的地址作为输入参数,其功能是交换那两个变量的值
- 1
- 2
- 3 #include <iostream>
- 4
- 5
- 6
- 7
- 8
- 9 void swap(int *first, int *second);
- 10
- 11 int main() {
- 12
- 13
- 14 int myNum1 = 23900;
- 15 int myNum2 = -149;
- 16
- 17
- 18 std::cout << "At first, myNum1 is "
- 19 << myNum1 << " and myNum2 is "
- 20 << myNum2 << "\n\n";
- 21
- 22
- 23 swap(&myNum1, &myNum2);
- 24
- 25
- 26 std::cout << "After calling the function, myNum1 is "
- 27 << myNum1 << " and myNum2 is "
- 28 << myNum2 << "\n\n";
- 29
- 30 std::cout << "Press Enter or Return to continue.\n";
- 31 std::cin.get();
- 32 return 0;
- 33
- 34 }
- 35
- 36
- 37 void swap(int *first, int *second) {
- 38
- 39
- 40 int temp;
- 41
- 42
- 43 temp = *first;
- 44
- 45
- 46 *first = *second;
- 47
- 48
- 49 *second = temp;
- 50
- 51 }
【责任编辑:
云霞 TEL:(010)68476606】