指针、数组作为函数的参数

一、指针作为函数的参数

指针最重要的应用是作为函数参数,它使得被调函数除了返回值之外,能够将更多的运算结果返回到主调函数中。

因此: 指针是函数参数传递的重要工具。

►函数形参可以是指针类型,一般形式为:

返回类型 函数名(指向类型 *指针变量名,...)

{

函数体

}

如:设计一个函数swap,用于交换两个变量的值

 #include <iostream> 
 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<<",max="<<b; //输出 
 return 0; 
 }

以下方法是错误的,无法修改a,b的值

 #include <iostream> 
 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<<",max="<<b; 
 return 0; 
 }

通过将指针作为函数参数的方法,既可以返回多个运算结果,又避 免了使用全局变量。

计算a和b的平方和、自然对数和、几何平均数、和的平方根。

 #include <iostream>
 #include <cmath>
 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<<x<<","<<y<<","<<fsq<<","<<fln<<","<<favg<<","<<fsqr<<endl;
 return 0;
 }

二、数组作为函数的参数

1. (一维或多维)数组作为函数的形参,例如:

double average(double *a, int n)
{
 … //函数体
}

函数调用形式如下:

double X[100], f;
f = average(X, 100);

编写函数average,返回数组n个元素的平均值

 #include <iostream>
 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="<<average(x,10)<<endl;
 return 0;
 } 

要想在子函数中改变主调函数中的数组元素,实参与形参的对应关 系有如下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 <iostream>
 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:"<<s2<<endl;
 stringcpy(&s3[7],s1); //复制s1到s3的后面
 cout<<"s3:"<<s3<<endl;
 return 0;
 } 

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木(。・ω・。)ノ♡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值