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