1

我必须编写一个程序,该程序具有一个函数,该函数将数组中的所有正数相加,但使用函数参数数组作为指针。当我尝试调用 sum 函数时,在 main 函数中出现问题。这是我的源代码:

#include <stdio.h>
#include <conio.h>
int posit(int *x[], int n){
  int s=0;
  for(int i=0; i<n; i++){
    if(*x[i]>0){
      s=s+*x[i];
    }
  }
  return s;
}
int main(){
  int k;
  scanf("%d",&k);
  int a[k];
  for(int i=0; i<k; i++){
    scanf("%d",&a[i]);
  }
  int b=posit(&a,k);
  printf("%d\n", b);
  getch();
  return 0;
}
4

3 回答 3

5

当一个数组被传递给一个函数时,它会衰减为指向其第一个元素的指针。将函数的签名更改为:

int posit(int* x, int n){ /* Equivalent to 'int posit(int x[], int n)' */

并将函数中数组的元素访问语法从*x[i]更改为 just x[i]。调用函数:

int b=posit(a,k);

值得一提的另一点是检查 的返回值scanf(),它返回所做的赋值次数,以确保&a[i]实际被赋值并且程序随后没有使用未初始化的变量。

您可能会发现 C FAQ 的数组和指针部分很有用。

于 2012-11-15T10:17:25.363 回答
1

实际上,在您的示例中,您将函数指针传递给指针(请注意,类似的符号经常与 main argument 一起使用char *argv[])。

正如 hmjd 帖子中提到的,在将数组传递给函数时,它被转换为其第一个元素的地址。除了显式使用指针 ( int *x),您还可以使用数组表示法 (int[]甚至int[k]),但它们是相同的。

另请注意,在第二种方法 ( int[k]) 中提供的大小无关紧要,并且内部函数将是未知的。当您处理多维数组时,这仅对包含大小很重要,但这是另一回事......

于 2012-11-15T10:36:26.473 回答
0

来自 K&R2

When an array name is passed to a function, what is passed is the 
location of the initial element. Within the called function, this 
argument is a local variable, and so an array name parameter is a 
pointer, that is, a variable containing an address.

因此,您只会将第一个元素传递给函数。

一旦理解了这一点,您的来源可以修改如下

int posit(int *x, int n)

并从 main 调用此函数,您可以使用

int b=posit(a,k); //Note only the location of the first element is being passed

于 2012-11-15T11:01:51.630 回答