天天看点

数据结构与C语言表示(2.0)

参数传递示例

#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);

继续阅读