2014-04-09 77 views
1

我是C的超級初學者,我想知道如果這些變量是正確傳遞的,我希望它們的值在main中被改變。我主要想知道我是否正確使用&和*。我是否正確傳遞這些變量? C編程

#include <stdio.h> 

int assign(int *i, int *scores[]); 

int main(void){ 
    int scores[30], i; 

    assign(&i, &scores[0]); 

    return 0; 
} 

int assign(int *i, int *scores[]){ 
    printf("Input scores:\n"); 
    for (i = 0; i < 30; i++){ 
     scanf("%d", *scores[*i]); 
    } 

} 
+0

還有我正在一個無法解析的外部錯誤,我不知道這意味着什麼。 – ShaneBird

+0

我也想知道。爲什麼不嘗試運行它並查看會發生什麼? –

+0

我認爲錯誤來自於在設置文件而不是控制檯應用程序中選擇Windows應用程序。 – ShaneBird

回答

3

要傳遞的間接太多的層次:

#include <stdio.h> 

void assign(int *scores); 

int main() { 
    int scores[30]; 
    assign(scores); 
    return 0; 
} 

void assign(int *scores) { 
    int i; 
    printf("Input scores:\n"); 
    for (i = 0; i < 30; i++) { 
     scanf("%d", &scores[i]); 
    } 
} 
+0

賦值(分數)==賦值(&分數[0])對不對? – ShaneBird

+0

另外我喜歡你用我作爲局部變量,這確實使它更容易。 – ShaneBird

+1

@ShaneBird:是的。確實如此。 –

1

&分數有類型char[30]*。指定想要char**。爲什麼要添加額外的間接? 用途:

int assign(int *i, int scores[static 30]); 

調用具有:

assign(&i, scores); 

理由:
C總是按值傳遞,所以使用指針是正確的。
但是C不能複製數組,它們幾乎每次使用都衰減爲指向第一個元素的指針。
此外,如果原型似乎期望數組,它實際上需要一個指針。
增加的static 30是保證編譯器(和讀者/程序員至少30元素使用上述指針訪問的標記。

另外,不要忘了derefference的時間正確的數量。目前,你不要

+1

他的代碼是'&scores [0]'這很好 –

+0

@MattMcNabb:只有在完全改變原型之後,它纔會對C數組產生明顯的誤解。我提議的更改使用慣用的C數組。 – Deduplicator

1

您可以*&更簡化代碼此外,您還可以傳遞一個ARRA y直接作爲指針。不需要做&scores[0]

#include <stdio.h> 



int assign(int i, int* scores){ 
    printf("Input scores:\n"); 
    for (i = 0; i < 30; i++){ 
     scanf("%d", &scores[i]); 
    } 

} 

int main(void){ 
    int scores[30], i; 
    assign(i, scores); 

    return 0; 
} 
0

您應該將數組大小傳遞給函數。 C型數組不知道它的大小。我們應儘可能避免使用魔法/硬編碼值。

//main function 
int scores[30], i; 
int size = sizeof(scores)/sizeof(scores[0]); 

// pass the size information as well 
int assign(int *i, int *scores[]), int size) { 

} 
1
#include <stdio.h> 

int assign(int *i, int scores[]); 

int main(void){ 
    int scores[30], i, j; 

    assign(&i, scores); 
    for(j=0;j<i;++j) 
     printf("%d %d\n", j, scores[j]); 
    return 0; 
} 

int assign(int *outSize, int scores[]){ 
    int i = 0; 
    printf("Input scores:\n"); 
    for (i = 0; i < 30; ++i){ 
     if(1!=scanf("%d", &scores[i])) 
      break; 
    } 
    return *outSize = i; 
}