最经典的案例
写一个交换函数,实现两个数的交换
#include<iostream> using namespace std; void swap1(int a,int b) { int temp=a; a=b; b=temp; cout<<"函数内交换结果:"<<endl; cout<<"a 的值:"<<a<<endl; cout<<"b 的值:"<<b<<endl; cout<<endl; } int main() { int a=10,b=20; cout<<a<<" "<<b<<endl; cout<<"a和b的初值:"<<endl; cout<<"a 的值:"<<a<<endl; cout<<"b 的值:"<<b<<endl; cout<<endl; swap1(a,b); cout<<"调用函数后的结果:"<<endl; cout<<"a 的值:"<<a<<endl; cout<<"b 的值:"<<b<<endl; cout<<endl; return 0; }
运行结果:
结果分析:很明显经过上面那个函数并没有实现想要的结果。
原因:采取上述传参,只是相当于把实参赋给了形参,但是形参并不影响实参,就像C++里面的语句:a=b;
这只是把b的值赋给a,但是对b并没有啥影响。
指针传递
#include<iostream> using namespace std; int swap1(int *p1,int *p2) { int temp=*p1; *p1=*p2; *p2=temp; cout<<"函数内交换结果:"<<endl; cout<<"a 的值:"<<*p1<<endl; cout<<"b 的值:"<<*p2<<endl; cout<<endl; } int main() { int a=10,b=20; cout<<"a和b的初值:"<<endl; cout<<"a 的值:"<<a<<endl; cout<<"b 的值:"<<b<<endl; cout<<endl; swap1(&a,&b); cout<<"调用函数后的结果:"<<endl; cout<<"a 的值:"<<a<<endl; cout<<"b 的值:"<<b<<endl; cout<<endl; return 0; }
运行结果:
结果分析:成功实现了交换
原因:对于写函数时候,函数的参数有指针(*p),调用函数时,传参传了一个地址( &a ),
可以这样理解 int *p=&a; 经过传参这个过程,就好比进行了一个指针的定义和赋值,实参的传递为函数为函数提供了一个地址,在函数内部可以对这个地址进行操作(可以改变地址的值或者进行赋值操作),这样一来,在函数里面进行交换,结果就能影响主函数的交换了(交换函数实现的本质)。