了解了一下交换函数,知道了函数不需要返回值的时候,函数声明的时候可以写void;
#include<iostream>
using namespace std;
void swap(int num1,int num2)
{
cout<<"交换前:"<<endl;
cout<<"num1="<<num1<<endl;
cout<<"num2="<<num2<<endl;
int temp=num1;
num1=num2;
num2=temp;cout<<"交换后;"<<endl;
cout<<"num1="<<num1<<endl;
cout<<"num2="<<num2<<endl;
return;}
int main(){
int a=20;
int b=10;
swap(a,b);
}
看似是发生交换了,实际上如何?!确实会 输出这样的结果;
但是! 如果我们直接输出前后交换的 实际参数 那结果呢? 结果就会大吃一惊,你会发现它并没有交换!
#include<iostream>
using namespace std;
void swap(int num1,int num2)
{
cout<<"形参交换前:"<<endl;
cout<<"num1="<<num1<<endl;
cout<<"num2="<<num2<<endl;
int temp=num1;
num1=num2;
num2=temp;
cout<<"形参交换后;"<<endl;
cout<<"num1="<<num1<<endl;
cout<<"num2="<<num2<<endl;
cout<<" "<<endl;
return;
}
int main(){
int a=20;
int b=10;
cout<<"实参" <<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<" "<<endl;
swap(a,b);
cout<<"实参交换"<<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
}
运行结果为:
所以 我理解了“当我们做值传递的时候,形参发生改变,并不会影响实参!”这句话的真正意义!
到底是为什么呢
是因为 这个值传递呢 它是 在 实际参数a,b 存在的情况下,又重新开辟了新的内存空间,也就是形参 num1 ,num2 ,进行了值传递 也就是 把a 的值复制给了 num1 ,把b的值复制给了num2 , a,b本身不发生任何变化,然后接下来的操作
创建了一个临时变量temp来储存num1的值,然后进行num2赋值给num1,temp又赋值给num2,最后输出交换后的num1和num2
这些操作就是完全对形参 也就是num1 和num2 做的操作了,与a和b无关,所以如果直接进行对a和b的前后输出的话,你会发现完全没变!
那为什么我们第一次输出的时候,会得到交换的数据呢
那是因为 我们实际上输出的交换数据并不是 主函数中实现的 真正的交换后的a和b,而是主函数中调用了 我们自己定义的swap函数,输出的东西也是swap中的交换后的形参,造成了类似的一种假象。