2012-11-15 50 views
1

我不得不寫一個程序,該程序的功能是將數組中的所有正數相加,但將函數參數數組作爲指針。在主函數中有一個問題發生,當我嘗試調用sum函數時。這裏是我的源代碼:如何在函數中使用數組指針?

#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; 
} 

回答

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]實際上是被分配和程序隨後沒有使用未初始化的變量。

您可能會發現C FAQ中的Arrays and Pointers部分有用。

+0

你說你的源可以被修改,在調用posit // int b = posit(&a,k)//函數之後,[這裏是我的「a」數組] [] [] [] [] []?我一開始就這樣寫過,但被導師拒絕了。他讓我寫這樣的函數// int posit(int * x [],int n)// – bbilegt

+1

@filemonster,'int * x []'是一個int *數組,它不是' int'。 – hmjd

+0

@filemonster:'&a'是一個指向數組的指針,其類型爲int(*)[k]' – newacct

1

其實在你的例子中,你正在傳遞函數指針指針(請注意,類似的表示法通常與主參數char *argv[]一起使用)。

正如在hmjd post中所提到的,當傳遞數組到函數時,它被轉換爲它的第一個元素的地址。除了明確使用指針(int *x)之外,您還可以使用數組表示法(int[]或甚至int[k]),但它們是相同的。

另請注意,在第二種方法(int[k])提供的大小並不重要,內部函數將不知道。這是唯一重要的,包括當你正在處理多個維數組的大小,但這是另外一個故事......

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) 

,如果我寫的* X []調用從主此功能,您可以使用

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