将数组传递给函数形式参数

时间:2015-03-30 12:42:37

标签: c arrays pointers

我对指针和数组有一些疑问。如果我错了,请纠正我。

1) 我在网上读过有两种方法可以将数组传递给一个函数。其中,函数的形式参数是一个数组,比如int a [] 第二个,其中形式参数是像int * a这样的指针 但是看看这里。在下面的代码中,第一种传递数组的技术已被使用。但我不明白为什么我们已经将平衡作为实际参数。我已经读过数组余额[],它'的名字,即"平衡"是第一个元素的常量指针。因此,balance的值是第一个元素的地址(* balance是数组的第一个元素)。

如果形式参数是指针,那就没问题了,因为在这种情况下,地址将被指定为形式参数指针的值。 我不明白为什么我们有一个数组作为形式参数和一个地址作为实际参数(参数)?

 #include <stdio.h>

/* function declaration */
double getAverage(int arr[], int size);

int main ()
{
    /* an int array with 5 elements */
  int balance[5] = {1000, 2, 3, 17, 50};
  double avg;

  /* pass pointer to the array as an argument */
  avg = getAverage( balance, 5 ) ;

 /* output the returned value */
  printf( "Average value is: %f ", avg );

 return 0;
}

3 个答案:

答案 0 :(得分:3)

声明一个像这样的正式参数

double getAverage(int arr1[], int size);
//                        ^^

与声明它是一样的:

double getAverage(int *arr2, int size);
//                    ^

编译器以相同的方式解释这两个声明:它允许解除引用arr1,就好像它是一个指针,当然它允许将方括号运算符应用于arr2,因为方括号适用于所有指针,以及数组。

传递balance也可以通过两种方式完成:您可以像在代码段中那样传递

avg = getAverage( balance, 5 );

或者像指向初始元素的指针:

avg = getAverage( &balance[0], 5 );

同样,两个调用都是相同的。

答案 1 :(得分:1)

  

我不明白为什么我们有一个数组作为形式参数和一个地址作为实际参数(参数)?

作为函数参数,int arr[]等同于int *arr。因此,当您将函数声明为

 double getAverage(int arr[], int size);  

编译器将其解释为

 double getAverage(int *arr, int size);  

这意味着,函数getAverage期望其第一个参数是指向intint *)的类型指针,而不是int的数组。

答案 2 :(得分:0)

#include<stdio.h>

double getAverage (int *arr, int size);

int main (void) {
    double avg;
    int balance [5]={1000, 2, 3, 17, 50};
    int *ptr;
    ptr = balance;
    avg= getAverage(ptr,5);
    printf("Average of the array is %f", avg);
    return 0;   
}

double getAverage (int *arr, int size) {
    int i;
    double sum=0.0;
    double avg=0.0;
    for (i=0; i<size; i++) {
        sum += *arr;
        arr = arr+1;
    }
    avg = (sum/size);
    return avg;
}