指针最重要的应用是作为函数参数,它使得被调函数除了返回值之外,能够将更多的运算结果返回到主调函数中。
因此: 指针是函数参数传递的重要工具。
►函数形参可以是指针类型,一般形式为:
如:设计一个函数swap,用于交换两个变量的值
#include
using namespace std;
void swap(int *p1, int *p2)
{
int t;
t=*p1 , *p1=*p2, *p2=t; //交换*p1和*p2
}
int main()
{
int a, b;
cin>>a>>b; //输入
if (a>b) swap(&a, &b);
cout<<"min="<
以下方法是错误的,无法修改a,b的值
#include
using namespace std;
void swap(int p1, int p2)
{
int t;
t=p1 , p1=p2, p2=t;
}
int main()
{
int a, b;
cin>>a>>b;
swap(a, b);
cout<<"min="<
通过将指针作为函数参数的方法,既可以返回多个运算结果,又避 免了使用全局变量。
计算a和b的平方和、自然对数和、几何平均数、和的平方根。
#include
#include
using namespace std;
double fun(double a, double b, double *sqab, double *lnab, double *avg)
{
*sqab=a*a+b*b; //*sqab返回平方和
*lnab=log(a)+log(b); //*lnab返回自然对数和
*avg=(a+b)/2; //*avg返回几何平均数
return (sqrt(a+b)); //函数返回和的平方根
}
int main()
{
double x=10,y=12,fsq,fln,favg,fsqr;
fsqr=fun(x, y, &fsq, &fln, &favg);
cout<
1. (一维或多维)数组作为函数的形参,例如:
double average(double *a, int n)
{
… //函数体
}
函数调用形式如下:
double X[100], f;
f = average(X, 100);
编写函数average,返回数组n个元素的平均值
#include
using namespace std;
double average(double *a, int n)
{ //等价于average(double a[], int n)
double avg=0.0, *p=a;
int i;
for (i=1;i<=n;i++,p++) avg=avg+*p ; //等价于avg=avg+p[i]
return n<=0 ? 0 : avg/n ;
}
int main()
{
double x[10]={66,76.5,89,100,71.5,86,92,90.5,78,88};
cout<<"average="<
要想在子函数中改变主调函数中的数组元素,实参与形参的对应关 系有如下4种,这4种情况作用相同。
(1)形参和实参都用数组名,例如:
void fun(int x[100], int n); //函数原型
int a[100];
fun(a, 100); //函数调用
(2)形参用指针变量,实参用数组名,例如:
void fun(int *x, int n); //函数原型
int a[100];
fun(a, 100); //函数调用
(3)形参与实参都用指针变量,例如:
void fun(int *x, int n); //函数原型
int a[100], p=a;
fun(p, 100); //函数调用
(4)形参用数组,实参用指针变量,例如:
void fun(int x[100], int n); //函数原型
int a[100], p=a;
fun(p, 100); //函数调用
2.字符指针变量作为函数形参
将一个字符串传递到函数中,传递的是地址,则函数形参既可以用 字符数组,又可以用指针变量,两种形式完全等价。在子函数中可 以修改字符串的内容,主调函数得到的是变化后的字符串。
自定义函数实现strcpy函数的字符串复制功能
#include
using namespace std;
char *stringcpy(char *strDest, const char *strSrc)
{
char *p1=strDest;
const char *p2=strSrc;
while (*p2!='\0') *p1=*p2, p1++ , p2++;
*p1='\0';
return strDest; //返回实参指针
}
int main()
{
char s1[80],s2[80],s3[80]="string=";
cin>>s1; //输入字符串
stringcpy(s2,s1); //复制s1到s2
cout<<"s2:"<