参数传递示例
#include <stdio.h>
void swap1(int a,int b)
{int c;
c=a;a=b;b=c;
printf("swap1中的a=%d,b=%d",a,b);
}
void swap2(int *a,int *b)
{int c;
c=*a,*a=*b,*b=c;
}
void main()
{int x=100,y=800;
swap1(x,y); /*调用函数swap1()*/
printf("\n调用swap1后x=%d,y=%d",x,y);
/*输出调用swap1后的数据*/
x=100;y=800;
swap2(&x,&y); /*调用函数swap2()*/
printf("\n调用swap2后x=%d,y=%d",x,y);
/*输出调用swap2后的数据*/
}
程序的输出结果为:
swap1中的a=800,b=100
调用swap1后x=100,y=800
调用swap2后x=800,y=100
调用swap1时,采用的是单项值传递,即便在swap1函数体中实现了两个变量互换内容的操作,但是当函数swap1调用结束后,由于变量a、b是局部变量,所以a、b的值的变化结果无法带出。
调用swap2时,采用的是地址传递,实参传递的是变量x和y的地址,在swap2的函数体中,通过访问指针变量a和b所指向的实参单元,实现了主函数中变量x和y中值的交换。x和y变量相对于swap2而言,是全程有效的。
4.函数结果的带出方式
函数结果共有全称变量、函数的返回值、参数传递三种带出方式。通过参数表的参数传递是一种参数显示传递方式,而通过全局变量是一种隐式参数传递,一个函数中对全局变量的改变会影响其他函数的调用,使用全局变量必须注意这个问题。
值传递方式中,值参数的作用域相当于该函数的局部变量,无法带出结果值,如果返回一个结果值,可以使用return返回方式带出一个函数结果值。
若函数结果需要带出多个值,该怎样实现?可以采用全局变量方式带出或通过地址传递(数组方式、结构体方式、指针方式)方式带出来实现。下面通过程序示例分别说明。
①全局变量方式:程序示例中的fun1()函数对MIN的改变就是一个全局变量方式带出的例子。
②数组方式:如果要返回的是多个相同类型的值,则可以将这些值放到一个数组中,然后返回数组的指针或首地址(如fun2()函数的数组b带出两个值)。
③结构体方式:如果要返回的是多个不同类型的值,则可以将这些值放到一个结构体中,然后返回结构体的指针或全局变量,但应注意的是该结构体必须是在全局范围内定义的结构体。如fun3()函数和fun4()函数,将最大、最小值放到结构体指针或结构体中。
④指针方式:如fun5()函数中指针x指向最大值,指针y指向最小值,通过地址传递参数这是一种参数显示传递方式。
【示例】函数带出方式示例
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int max,min;
} Data;
int MIN; /*全局变量*/
int fun1(int a[],int n)
/*通过函数return返回最大值,通过全局变量MIN带出最小值*/
{ int i,max;
max=MIN=a[0];
for(i=1;i<n;i++)
{
if(a[i]>max)max=a[i];
if(a[i]<MIN)MIN=a[i];
}
return(max);
}
int *fun2(int a[],int n)
/*将最大值、最小值放到数组b中,通过return返回*/
{ static int b[2];
b[0]=b[1]=a[0]; //给最大值、最小值赋初值
int i;
for(i=1;i<n;i++)
{
if(a[i]>b[0])
b[0]=a[i];
if(a[i]<b[1])
b[1]=a[i];
}
return(b);
}
Data *fun3(int a[],int n)
/*将最大值、最小值放到结构体中,通过return返回结构体指针p*/
{Data *p;
int i;
p=(Data *)malloc(sizeof(Data)); //指针初始化
p->max=p->min=a[0]; //给最大值、最小值赋初值
for(i=1;i<n;i++)
{
if(a[i]>p->max)
p->max=a[i];
if(a[i]<p->min)
p->min=a[i];
}
return(p);
}
Data fun4(int a[],int n)
/*将最大值、最小值放到结构体p中,通过结构体p带回返回值*/
{ Data p;
int i;
p.max=p.min=a[0]; //给最大值、最小值赋初值
for(i=0;i<n;i++)
{
if(a[i]>p.max)
p.max=a[i];
if(a[i]<p.min)
p.min=a[i];
}
return(p);
}
void fun5(int a[],int n,int *p,int *q)
/*用指针带回结果,指针p指向最大值,指针q指向最小值*/
{ int i;
*p=*q=a[0]; //给最大值、最小值赋初值
for(i=1;i<n;i++)
{
if(*p<a[i])
*p=a[i];
if(*q>a[i])
*q=a[i]
}
}
void main()
{ int a[10]={1,3,9,8,4,2,5,0,7,6},max,*p;
Data *q;
Data z;
int x,y;
max=fun1(a,10);
printf("max=%d min=%d\n",max,MIN);
p=fun2(a,10);
printf("max=%d min=%d\n",p[0],p[1]);
q=fun3(a,10);
printf("max=%d min=%d\n",q->max,q->min);
z=fun4(a,10);
printf("max=%d min=%d\n",z.max,z.min);
fun5(a,10,&x,&y);
printf("max=%d min=%d\n",x,y);
}