1 #include <iostream> 2 3 using namespace std; 4 void swap2(int p1, int p2) //定义---此处传的是数值 5 { 6 cout<<"funIn value p1="<<p1<<" funIn value p2="<<p2<<" funIn addr p1:"<<&p1<<" funIn addr p2:"<<&p2<<endl; 7 int p; p=p1; p1=p2; p2=p; 8 cout <<"p addr"<<&p<<endl; 9 cout<<"funOut value p1="<<p1<<" funOut value p2="<<p2<<" funOut addr p1:"<<&p1<<" funOut addr p2:"<<&p2<<endl; 10 } 11 int main()//调用 12 { 13 int c=3,d=4; 14 cout<<"Input value c="<<c<<" Input value d="<<d<<" Input addr c:"<<&c<<" Input addr d:"<<&d<<endl; 15 swap2(c,d); 16 cout<<"Output value c="<<c<<" Output value d="<<d<<" Output addr c:"<<&c<<" Output addr d:"<<&d; 17 }
运行结果:
2.引用传递:
01调用函数时,相当于&p1=c,&p2=d(将内存中c和d分别取别名,不懂取别名的要先看看引用的基础)
02在函数内部,用着这个别名(形参)的操作实际是操作的实参(从函数中打印c和d的地址可以看出操作的是实参所在的内存地址),
03引用传递的适用范围:当希望函数能改变实参的值时候,使用引用传递
04再来几行代码让你看看引用(起别名)的意义:打印结果是01,这说明给了别名之后,对原变量的操作是操作,对引用名字的操作也是对原变量的操作,总之!!原名字和引用名都是指向同一个变量(也是同一个内存地址),可以理解成给你起了个小名,你的大名和小名都指向你。
#include <iostream> using namespace std; int main() { int a=0 ; const int &ra=a; cout << ra; // ra=1;//错误的!因为不能再对ra赋值了 a=1; cout << ra; }
1 #include <iostream> 2 3 using namespace std; 4 void swap2(int &p1, int &p2) //定义---此处传的是引用 5 { 6 cout<<"funIn value p1="<<p1<<" funIn value p2="<<p2<<" funIn addr p1:"<<&p1<<" funIn addr p2:"<<&p2<<endl; 7 int p; p=p1; p1=p2; p2=p; 8 cout <<"p addr"<<&p<<endl; 9 cout<<"funOut value p1="<<p1<<" funOut value p2="<<p2<<" funOut addr p1:"<<&p1<<" funOut addr p2:"<<&p2<<endl; 10 } 11 int main()//调用 12 { 13 int c=3,d=4; 14 cout<<"Input value c="<<c<<" Input value d="<<d<<" Input addr c:"<<&c<<" Input addr d:"<<&d<<endl; 15 swap2(c,d); 16 cout<<"Output value c="<<c<<" Output value d="<<d<<" Output addr c:"<<&c<<" Output addr d:"<<&d; 17 }
运行结果:
3.指针传递:
(1)
01调用函数时,相当于*p1=&c,*p2=&d(在内存中新建两个指针分别为*p1和*p2(声明),p1指针指向c所在的地址(定义),p2指针指向d所在的地址(定义)),不懂指针声明和定义的先去看看书)
02在函数内部,定义了一个临时变量p,两两交换后(始终是值交换),p1和p2指向的地址未变,变的是指向的地址的内容,而其指向的内容就是实参c和实参d,下图中的第7行就是在操作实参c和d
03指针传递适用范围:
1 #include <iostream> 2 3 using namespace std; 4 void swap2(int *p1, int *p2) //定义---此处传的是指针 5 { 6 cout<<"funIn pointvalue p1="<<*p1<<" funIn pointvalue p2="<<*p2<<" funIn value p1="<<p1<<" funIn value p2="<<p2<<" funIn addr p1:"<<&p1<<" funIn addr p2:"<<&p2<<endl; 7 int p; p=*p1; *p1=*p2; *p2=p; 8 cout <<"funIn pointvalue p="<<p<<" funIn value p="<<p<<" funIn addr p:"<<&p<<endl; 9 cout<<"funOut pointvalue p1="<<*p1<<" funOut pointvalue p2="<<*p2<<" funOut value p1="<<p1<<" funOut value p2="<<p2<<" funOut addr p1:"<<&p1<<" funOut addr p2:"<<&p2<<endl; 10 } 11 int main()//调用 12 { 13 int c=3,d=4; 14 cout<<"Input value c="<<c<<" Input value d="<<d<<" Input addr c:"<<&c<<" Input addr d:"<<&d<<endl; 15 swap2(&c,&d); 16 cout<<"Output value c="<<c<<" Output value d="<<d<<" Output addr c:"<<&c<<" Output addr d:"<<&d; 17 }
运行结果:
(2)介绍一个容易和(1)混淆的代码
01调用函数时,相当于*p1=&c,*p2=&d(在内存中新建两个指针分别为*p1和*p2(声明),p1指针指向c所在的地址(定义),p2指针指向d所在的地址(定义)),不懂指针声明和定义的先去看看书)
02在函数内部,定义了一个临时指针*p,两两交换后(始终是指针相互交换),p1和p2指向的地址互换,但这个互换并未影响c和d的值以及c和d所在的地址,因此实参c、d未发生任何改变
02
1 #include <iostream> 2 3 using namespace std; 4 void swap2(int *p1, int *p2) //定义---此处传的是指针 5 { 6 cout<<"funIn pointvalue p1="<<*p1<<" funIn pointvalue p2="<<*p2<<" funIn value p1="<<p1<<" funIn value p2="<<p2<<" funIn addr p1:"<<&p1<<" funIn addr p2:"<<&p2<<endl; 7 int *p; p=p1; p1=p2; p2=p; 8 cout <<"funIn pointvalue p="<<*p<<" funIn value p="<<p<<" funIn addr p:"<<&p<<endl; 9 cout<<"funOut pointvalue p1="<<*p1<<" funOut pointvalue p2="<<*p2<<" funOut value p1="<<p1<<" funOut value p2="<<p2<<" funOut addr p1:"<<&p1<<" funOut addr p2:"<<&p2<<endl; 10 } 11 int main()//调用 12 { 13 int c=3,d=4; 14 cout<<"Input value c="<<c<<" Input value d="<<d<<" Input addr c:"<<&c<<" Input addr d:"<<&d<<endl; 15 swap2(&c,&d); 16 cout<<"Output value c="<<c<<" Output value d="<<d<<" Output addr c:"<<&c<<" Output addr d:"<<&d; 17 }
运行结果:
原文:https://www.cnblogs.com/huskyWuWuWu/p/14882176.html