參數傳遞示例
#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);