C中的数组和指针地址

时间:2015-03-08 10:40:08

标签: c

我被要求编写一个返回数组中数字平均值的函数。它很直接:

int array_sum(int seq[], int len) {
int sum = 0;
for (int i = 0; i < len; ++i) {
sum += seq[i];}
return sum;}

float array_avg(int seq[], int len) {
int sum = number_sum(seq,len);
return sum/len;}

但现在我必须重写它,以便seq是一个指针:

int array_sum(int *seq, int len) {   <--- This function is working properly
int sum =0;
for(int *p = seq; p < len+seq; ++p)
{sum += *p;}
return sum;}  

float seq_avg(int *seq, int len) {
int sum = number_sum(*seq,len);  <---- THIS LINE CAUSES AN ERROR
return sum/len;}

我试过了

-number_sum(* SEQ,LEN);

-number_sum(安培; SEQ,LEN);

但它们似乎都没有用。如何使它工作?

2 个答案:

答案 0 :(得分:3)

您应该只传递指针,而不是取消引用它:*seqintseqint*

float seq_avg(int *seq, int len) {
    int sum = number_sum(seq, len);
    return sum/len;}

此外,您的方法名为array_sum,而不是number_sum,您获得的确切错误是什么?可以使用与第一种方法相同的方式调用它,也可以使用seq[i]以相同的方式完成索引。

复制粘贴并检查它是否有效:

int array_sum(int* seq, int len)
{
  int sum = 0;
  for (int i = 0; i < len; i++) {
    sum += seq[i];
  }
  return sum;
}

float array_avg(int* seq, int len) 
{
  int sum = array_sum(seq, len);
  return sum / len;
}

答案 1 :(得分:2)

int array_sum(int seq[], int len)

和这个

int array_sum(int * seq, int len) 

是等价的。

在这两种情况下,seq都是指向int的指针。

从这个结论来看,使用了函数的两个实现,将用相同的方式调用。

int array_sum(int * seq, size_t len)
{
  int sum = 0;
  for (size_t i = 0; i < len; ++i) 
  {
    sum += seq[i];
  }
  return sum;
}

float array_avg(int * seq, size_t len) 
{
  int sum = array_sum(seq, len);
  return (float) sum / len; /* By casting sum to float you make 
                               sure not an integer division is performed. */
}

这样称呼:

int main(void)
{
  int a[] = {0, 3, 2, 4, 1};
  float avg = array_avg(a, sizeof a / sizeof a[0]);
  return 0;
}