在C函数中将指针作为参数传递

时间:2017-09-30 22:34:15

标签: c arrays pointers

我阅读了有关此主题的所有已回答的问题,但我没有回答我的问题......

我仍在阅读C中的指针,现在我正在尝试理解指针如何通过函数传递。但是,我在下面的代码(取自tutorialspoint.com)中有一些我不理解的东西:

#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\n", avg );
   return 0;
}

double getAverage(int *arr, int size) {

   int  i, sum = 0;       
   double avg;          

   for (i = 0; i < size; ++i) {
      sum += arr[i];
   }

   avg = (double)sum / size;
   return avg;
}

当调用getAverage(balance,5)时,我传入一个指向balance数组的第一个元素的指针(正如我在上一个问题中所学到的)。但是我们如何在getAverage中的for循环中访问数组的实际内容(sum + = arr [i])?

我阅读了以下来源:http://c-faq.com/aryptr/aryptrequiv.html,我很确定第二个脚注之后的句子正在解释这个问题。但我还是不明白。

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

getAverage中,arr指向balance的第一个元素,如您所述。因此,*arr可用于访问第一个元素(读取或写入),就像balance[0]在调用者中一样。

要访问第二个元素,您可以在解除引用之前向指针添加一个元素,即*(arr + 1),依此类推。这实际上相当于arr[1]。特别是,arr[i]相当于*(arr + i)。它将偏移i添加到地址arr,按指向的大小缩放,然后取消引用指针。

答案 1 :(得分:0)

因为数组被分配为连续内存块,所以您只需知道两件事就可以访问数组中的任何元素:

  1. 此内存块的起始位置(即arr)。
  2. 元素相对于起始位置的位置(即索引i)。
  3. 因此调用arr[i]将有效地计算数组起始位置的i个空格,并返回该索引处的值。