对于自定义函数,我们需要建立实参与形参之间的关系,这种关系可以分为传值调用和传址调用,二者在结果上的区别就是传值调用不能改变实参的值,而传址调用可以改变原实参的值。
下面以自定义swap函数为例说明:
一、传值调用:不能改变实参的值,较容易理解,略。
二、传址调用:
1、引用传递:(常用)
注意事项:①、int &a=n;表示给n起了一个别名a;
②、函数内对a的操作及对n进行操作。
示例代码:
#include<bits/stdc++.h>
using namespace std;
void swap(int &x,int &y) //*
{
int temp;
temp=x;x=y;y=temp;
}
int main()
{
int a,b;
cin>>a>>b;
swap(a,b);
cout<<"after swap:"<<a<<" "<<b;
return 0;
}
2、指针传递:
注意事项:①、int *p(定义一个指针变量),若在定义过程中对指针p赋值(int *p=?),则给p的应是一个地址;在正常语句中,*p=?表示给p所指向的目标变量赋值。
示例代码:
#include<bits/stdc++.h>
using namespace std;
void swap( int *x,int *y )//定义时将a,b的地址传给指针型变量x和y;
{
int temp=*x;//对指针型变量所指向的目标变量a,b赋值;
*x=*y;
*y=temp;
}
int main()
{
int a,b;
cin>>a>>b;
swap(&a,&b); //实参向形参传递的应为指针型变量;
cout<<"after swap:"<<a<<" "<<b;
return 0;
}
========================================================================
最后关于数组与指针问题的几点注意事项:
①、a[1]表示的是一个数值,*(a+1)表示的是数值;a+1表示的是a[1]的地址(同样&a[1]表示的也是a[1]的地)。
如:
#include<bits/stdc++.h>
using namespace std;
int a[101];
int main()
{
a[1]=9;
cout<<"a[1]="<<a[1]<<endl;
cout<<"adress :a[1]="<<a+1<<endl;
return 0;
}
②、a表示的是a数组的首地址,即a[0]的地址,如果用指针swap(a,b);那么交换的仅仅是a,b的第一个数。
③、指针型变量p+1表示指向数组的下一个同数据类型元素,而不是下一个字节。