#includevoid swap(int m,int n){ printf("形参交换前m=%d n=%dn",m,n); int temp; temp=m; m=n; n=temp; printf("形参交换后m=%d n=%dn",m,n); } void main(){ int a,b; printf("请输入a,b两个实参值:"); scanf("%d %d",&a,&b); swap(a,b); printf("实参交换后a=%d b=%dn",a,b); }
由以上结果表明,传值只传递实参的副本(即形参),函数只对形参进行操作,对实参无影响
注意:函数调用结束后,普通变量会被自动销毁,而指针不会被自动销毁,所以使用指针可以实现值的回传
2.参数传递:传地址(C/C++) 2.1 传递指针变量正确示范操作:
以下操作通过传地址实现了实参值转换
#includevoid swap(int *m, int *n){ //传入实参a,b的存储地址 printf("形参交换前:m=%d n=%dn",*m,*n); printf("形参交换前,m的存储地址:%d n的存储地址:%dn",&m,&n); int t; //中间变量 t=*m; //解引用m获得值,其实在交换指针存储的内容(即变量的存储地址) *m=*n; //所以实现了实参值的交换 *n=t; printf("形参交换后:m=%d n=%dn",*m,*n); printf("形参交换后,m的存储地址:%d n的存储地址:%dn",&m,&n); } void main(){ int a,b,*p1,*p2; printf("请输入两个实参值a,b:"); scanf("%d %d",&a,&b); p1=&a,p2=&b; //获取变量a,b地址 printf("实参交换前,a的存储地址%d b的存储地址%dn",&a,&b); swap(p1,p2); printf("实参交换后a=%d b=%dn",a,b); printf("实参交换后,a的存储地址%d b的存储地址%dn",&a,&b); }
以上操作本质上是交换了两个解引用的值
错误示范操作:
以下操作并没有通过传地址实现实参值转换
#includevoid swap(float *m,float *n){ printf("形参交换前,m=%f n=%fn",*m,*n); printf("形参交换前,m的存储地址:%X n的存储地址:%Xn",&m,&n); float *t; //定义指针t t=m; //只是在交换指针的存储地址,而并不是在交换指针的存储内容(即变量的存储地址) m=n; //所以无法实现实参值的交换 n=t; printf("形参交换后,m=%f n=%fn",*m,*n); printf("形参交换后,m的存储地址:%X n的存储地址:%Xn",&m,&n); } void main(){ float a,b,*p1,*p2; printf("请输入两个实参值a,b:"); scanf("%f %f",&a,&b); p1=&a; p2=&b; printf("实参交换前,a的存储地址:%X b的存储地址:%Xn",&a,&b); swap(p1,p2); printf("实参交换后,a=%f b=%fn",a,b); printf("实参交换后,a的存储地址:%X b的存储地址:%Xn",&a,&b); }
以上操作本质上是交换了指针的值
原来指针m指向a,现改为指向b
原来指针n指向b,现改为指向a
a,b值并没有进行交换
#include#define N 10 int max(int a[]); int main ( ) { int a[10]; int i,m; for(i=0;i >a[i]; m=max(a); //传入数组首元素地址(数组名) std::cout<<"the max number is:"< 3.参数传递:传引用(C++)
#includevoid swap(float &m,float &n){ float temp; temp=m; m=n; n=temp; } int main(){ float a,b; std::cin >> a >> b; std::cout << a << b << std::endl; swap(a,b); std::cout << a << b << std::endl; } 以上操作本质上是交换了引用值(即交换了原值),对引用的操作就是对被引用的操作



