我们的预期是将x,y两变量的值交换,最后应该得到结果为”x=8,y=9”才对呀,为什么会这样呀?
我们要了解函数的形参实参两者的关系,在函数执行过程中,我们的实参只是将数值传给了形参。是单向传递的,即数值传递只能是由实参传递到形参,不能由形参传递到实参。
其实也可以这样理解:子函数的存储空间在stack中是独立于其他程序而存在的,也就是说“形参x=9,y=8对应的地址与函数体中形参对应的地址不是一个地址,即不是一个变量,只是名字重合了而已”。而且在上述子函数中“无return”返回值语句,因此当子函数执行万就自动释放了,cout<<x<<y<<endl调用的x,y还是之前刚被定义未改变的值。
怎么修改才能达到预期效果?
用指针作为实参与实参交换的值,为了使得在子函数操作的对象与实参是同一个变量包括同地址同数值,而不仅限于数值相同。
#include <iostream> using namespace std; void swap(int* x, int* y); int main() { int x = 9, y = 8; swap(&x, &y); cout << "x=" << x << ",y=" << y << endl; // 输出结果为“x=8,y=9”符合我们的预期 } // 形参未变量的地址可以使得被操作对象,即函数体内的操作对象,就是我们想要操作的实际参数 void swap(int* x, int* y) // 实现两变量数值交换的程序 { int t; t = *x; *x = *y; *y = t; }
实现一个函数,作用是获取一个数组中的最大值和最小值:
#include <iostream> using namespace std; void get_maxmin(int* num_max, int* num_min, int* num); int main() { int num[10] = { 1,8,3,8,6,11,75,200,6,0 }, num_max = 0, num_min = 0; get_maxmin(&num_max, &num_min, num); cout << "max=" << num_max << endl; cout << "min=" << num_min << endl; } void get_maxmin(int* num_max, int* num_min, int* num) { int i = 0; for (; i < 10; i++) { if (*num_max <= *(num+i)) { *num_max = *(num + i); } else if (*num_min >= *(num + i)) { *num_min = *(num + i); } } }