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

Posted

技术标签:

【中文标题】将数组传递给函数形式参数【英文标题】:passing an array to a function formal parameter 【发布时间】:2015-03-30 12:42:36 【问题描述】:

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

1) 我在网上读到有两种将数组传递给函数的方法。其中,函数的形式参数是一个数组,如 int a[] 第二个,其中形式参数是一个指针,如 int *a 但是看看这里。在下面的代码中,使用了第一种传递数组的技术。但是我不明白为什么我们将 balance 作为实际参数传递。我已经阅读了数组 balance[] 的名称,它是is "balance" 是指向第一个元素的常量指针。因此,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;

【问题讨论】:

double getAverage(int arr[], int size);double getAverage(int *arr, int size);完全相同相同/等效。 是的!明白了!:)你在哪里学的这些东西? 【参考方案1】:

像这样声明形参

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

和这样声明是一样的:

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

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

传递balance 也可以通过两种方式完成:您可以按照您在代码 sn-p 中的方式传递它

avg = getAverage( balance, 5 );

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

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

同样,两个调用彼此相同。

【讨论】:

嘿,我不知道编译器将 arr1[] 解释为指针。不过我知道衰减的东西。你从哪里可以学习这些东西?我的意思是我确信没有详尽的资源对于谷歌上的 c 语言。我只是不断地从一个教程切换到另一个教程。你读过一些书来学习这种东西吗?谢谢一切! @garfield 我从K&R 学到的几乎所有关于 C 语言的知识。这本相对较小的书涵盖了端到端的语言,因此我强烈建议您阅读这本书并完成其中的所有练习。 我一定会读那本书!我介绍了一些印度作者的 let us c.Its。它没有涵盖所有概念。 :P 非常感谢 :D上帝保佑你 对不起,两个调用并不完全相同,因为第一个是指向整个数组的指针(因此,应用于指向的东西的 sizeof 运算符是数组的大小)但第二个意味着指向第一个元素的指针(它的 sizeof 运算符给出了数组元素的大小)尽管如此,由于两者都作为指向 int 的指针传递,最后,没有办法从函数体内获取数组大小(这就是将元素数量作为参数传递的原因) @LuisColorado sizeof 操作符与这里有什么关系?我说的是调用函数,sizeof 运算符绝对是不是函数。【参考方案2】:

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

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

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

编译器将其解释为

 double getAverage(int *arr, int size);  

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

【讨论】:

【参考方案3】:
#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;

【讨论】:

以上是关于将数组传递给函数形式参数的主要内容,如果未能解决你的问题,请参考以下文章

将参数从php中的数组传递给构造函数[重复]

将数组传递给 PostgreSQL PL/pgSQL 函数

使用 map 函数将数组中的值传递给 redshift 参数化查询

将静态数组作为参数传递

将数组传递给接受参数 object[] 或 IEnumerable<T> 的函数

xtensor 将 numpy 数组传递给具有 xt::xtensor 参数类型的函数