如何在函数中使用数组指针?

时间:2012-11-15 10:14:38

标签: c arrays pointers

我必须编写一个程序,它具有一个函数,该函数对数组中的所有正数进行求和,但使用函数参数数组作为指针。当我尝试调用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;
}

3 个答案:

答案 0 :(得分:5)

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

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

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

int b=posit(a,k);

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

您可能会发现C FAQ的Arrays and Pointers部分很有用。

答案 1 :(得分:1)

实际上在你的例子中,你传递给指针的函数指针(请注意,类似的表示法通常与主参数char *argv[]一起使用)。

如hmjd post中所述,在将数组传递给函数时,它将转换为其第一个元素的地址。您也可以使用数组表示法(int *x或甚至int[]),而不是显式使用指针(int[k]),但它们是相同的。

请注意,在第二种方法(int[k])中提供的大小无关紧要,而且在内部功能中它将是未知的。当您处理多个维度数组时,这对于包含大小非常重要,但这是另一个故事...

答案 2 :(得分:0)

来自K&amp; 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