天天看點

資料結構與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);

繼續閱讀