chunlanse2014

导航

第七节 数组名作函数参数(八)

数组名可以作函数的实参和形参。如:

 1 main()
 2 {
 3     int array[10];
 4     /* …… */
 5     /* …… */
 6     f(array,10);
 7     /* …… */
 8     /* …… */
 9 }
10 f(int arr[],int n);
11 {
12     /* …… */
13     /* …… */
14 }
View Code

array为实参数组名,arr为形参数组名。在学习指针变量之后就更容易理解这个问题了。数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,形参得到该地址后也指向同一数组。这就好像同一件物品有两个彼此不同的名称一样。



同样,指针变量的值也是地址,数组指针变量的值即为数组的首地址,当然也可作为函数的参数使用。

【例10-15】

 1 float aver(float *pa);
 2 main()
 3 {
 4     float sco[5],av,*sp;
 5     int i;
 6     sp=sco;
 7     printf("\ninput 5 scores:\n");
 8     for(i=0;i<5;i++)
 9         scanf("%f",&sco[i]);
10     av=aver(sp);
11     printf("average score is %5.2f",av);
12 }
13 float aver(float *pa)
14 {
15     int i;
16     float av,s=0;
17     for(i=0;i<5;i++) 
18          s=s+*pa++;
19     av=s/5;
20     return av;
21 }
10-15代码

 

【例10-16】将数组a中的n个整数按相反顺序存放。
算法为:将a[0]与a[n-1]对换,再a[1]与a[n-2] 对换……,直到将a[(n-1/2)]与a[n-int((n-1)/2)]对换。今用循环处理此问题,设两个“位置指示变量”i和j,i的初值为0,j的初值为n-1。将a[i]与a[j]交换,然后使i的值加1,j的值减1,再将a[i]与a[j]交换,直到i=(n-1)/2为止,如图所示。


程序如下:

void inv(int x[],int n)     /*形参x是数组名*/
{
    int temp,i,j,m=(n-1)/2;
    for(i=0;i<=m;i++)
    {
        j=n-1-i;
        temp=x[i];
        x[i]=x[j];
        x[j]=temp;
    }
    return;
}
main()
{
    int i,a[10]={3,7,9,11,0,6,7,5,4,2};
    printf("The original array:\n");
    for(i=0;i<10;i++)
        printf("%d,",a[i]);
    printf("\n");
    inv(a,10);
    printf("The array has benn inverted:\n");
    for(i=0;i<10;i++)
        printf("%d,",a[i]);
    printf("\n");
}
10-16代码

 

对此程序可以作一些改动。将函数inv中的形参x改成指针变量。

【例10-17】将函数inv中的形参x改成指针变量。程序如下:

 1 void inv(int *x,int n)     /*形参x为指针变量*/
 2 {
 3     int *p,temp,*i,*j,m=(n-1)/2;
 4     i=x;
 5     j=x+n-1;
 6     p=x+m;
 7     for(;i<=p;i++,j--)
 8    {
 9         temp=*i;
10         *i=*j;
11         *j=temp;
12     }
13     return;
14 }
15 main()
16 {
17     int i,a[10]={3,7,9,11,0,6,7,5,4,2};
18     printf("The original array:\n");
19     for(i=0;i<10;i++)
20         printf("%d,",a[i]);
21     printf("\n");
22     inv(a,10);
23     printf("The array has benn inverted:\n");
24     for(i=0;i<10;i++)
25         printf("%d,",a[i]);
26     printf("\n");
27 }
10-17代码

 

运行情况与前一程序相同。

【例10-18】从10个数中找出其中最大值和最小值。

调用一个函数只能得到一个返回值,今用全局变量在函数之间“传递”数据。程序如下:

 1 int max,min;     /*全局变量*/
 2 void max_min_value(int array[],int n)
 3 {
 4     int *p,*array_end;
 5     array_end=array+n;
 6     max=min=*array;
 7     for(p=array+1;p<array_end;p++)
 8     if(*p>max) 
 9         max=*p;
10     else if (*p<min)
11         min=*p;
12     return;
13 }
14 main()
15 {
16     int i,number[10];
17     printf("enter 10 integer umbers:\n");
18     for(i=0;i<10;i++)
19         scanf("%d",&number[i]);
20     max_min_value(number,10);
21     printf("\nmax=%d,min=%d\n",max,min);
22 }

 

说明:
1) 在函数max_min_value中求出的最大值和最小值放在max和min中。由于它们是全局,因此在主函数中可以直接使用。

2) 函数max_min_value中的语句:
    max=min=*array;
array是数组名,它接收从实参传来的数组numuber的首地址。

*array相当于*(&array[0])。上述语句与 max=min=array[0];等价。

3) 在执行for循环时,p的初值为array+1,也就是使p指向array[1]。以后每次执行p++,使p指向下一个元素。每次将*p和max与min比较。将大者放入max,小者放min。


4) 函数max_min_value的形参array可以改为指针变量类型。实参也可以不用数组名,而用指针变量传递地址。

【例10-19】程序可改为:

 1 int max,min;     /*全局变量*/
 2 void max_min_value(int *array,int n)
 3 {
 4     int *p,*array_end;
 5     array_end=array+n;
 6     max=min=*array;
 7     for(p=array+1;p<array_end;p++)
 8         if(*p>max) 
 9             max=*p;
10         else if (*p<min)
11             min=*p;
12     return;
13 }
14 main()
15 {
16     int i,number[10],*p;
17     p=number;     /*使p指向number数组*/
18     printf("enter 10 integer umbers:\n");
19     for(i=0;i<10;i++,p++)
20         scanf("%d",p);
21     p=number;
22     max_min_value(p,10);
23     printf("\nmax=%d,min=%d\n",max,min);
24 }
10-19代码

 

归纳起来,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种:

1) 形参和实参都是数组名。

 1 main()
 2 {
 3     int a[10];
 4     /* …… */
 5     f(a,10)
 6     /* …… */
 7     f(int x[],int n)
 8     {
 9         /* …… */
10     }
11 }
1)

 

a 和 x 指的是同一组数组。

2) 实用数组,形参用指针变量。

 1 main()
 2 {
 3     int a[10];
 4     /* …… */
 5     f(a,10)
 6     /* …… */
 7     f(int *x,int n)
 8     {
 9         /* …… */
10     }
11 }
2)

 

3) 实参、型参都用指针变量。

4) 实参为指针变量,型参为数组名。

【例10-20】用实参指针变量改写将n个整数按相反顺序存放。

 1 void inv(int *x,int n)
 2 {
 3     int *p,m,temp,*i,*j;
 4     m=(n-1)/2;
 5     i=x;
 6     j=x+n-1;
 7     p=x+m;
 8     for(;i<=p;i++,j--)
 9     {
10         temp=*i;
11         *i=*j;
12         *j=temp;
13     }
14     return;
15 }
16 main()
17 {
18     int i,arr[10]={3,7,9,11,0,6,7,5,4,2},*p;
19     p=arr;
20     printf("The original array:\n");
21     for(i=0;i<10;i++,p++)
22         printf("%d,",*p);
23     printf("\n");
24     p=arr;
25     inv(p,10);
26     printf("The array has benn inverted:\n");
27     for(p=arr;p<arr+10;p++)
28         printf("%d,",*p);
29     printf("\n");
30 }
10-20代码

 

注意:main函数中的指针变量p是有确定值的。即如果用指针变作实参,必须现使指针变量有确定值,指向一个已定义的数组。

【例10-21】用选择法对10个整数排序。

 1 main()
 2 {
 3     int *p,i,a[10]={3,7,9,11,0,6,7,5,4,2};
 4     printf("The original array:\n");
 5     for(i=0;i<10;i++)
 6         printf("%d,",a[i]);
 7     printf("\n");
 8     p=a;
 9     sort(p,10);
10     for(p=a,i=0;i<10;i++)
11     {
12         printf("%d  ",*p);
13         p++;
14     }
15     printf("\n");
16 }
17 sort(int x[],int n)
18 {
19     int i,j,k,t;
20     for(i=0;i<n-1;i++)
21     {
22         k=i;
23         for(j=i+1;j<n;j++)
24             if(x[j]>x[k])k=j;
25         if(k!=i)
26         {
27             t=x[i];
28             x[i]=x[k];
29             x[k]=t;
30         }
31     }
32 }
10-21代码

 

说明:函数sort用数组名作为形参,也可改为用指针变量,这时函数的首部可以改为:
    sort(int *x,int n)
其他可一律不改。

posted on 2015-04-06 15:09  chunlanse2014  阅读(316)  评论(0编辑  收藏  举报