2015-05-02 65 views

回答

1

如何將一個數組傳遞給一個函數,而不是在函數外部進行更改?

你可能想換陣列中的struct和按值傳遞這個struct的一個實例。

例如,這本看起來是這樣的:

#include <stdio.h> 


struct array_wrapper 
{ 
    int vec[1]; 
} 

fun(struct array_wrapper aw) 
{ 
    aw.vec[0] = -1; 
    printf("copy of array's 1st element inside fun(): %d\n", aw.vec[0]); 
} 

int main(void) 
{ 
    struct array_wrapper aw; 
    aw.vec[0] = 0; 

    printf("original array's 1st element prior to calling fun(): %d\n", 
    aw.vec[0]); 

    fun(aw); 

    printf("original array's 1st element after having returned from fun(): %d\n", 
    aw.vec[0]); 
    ... 
1

在C中沒有原生的方式,通過價值,因爲它們「衰減」爲指針,以他們的第一個元素時,他們被作爲參數傳遞給傳遞數組。

但有一個竅門:聲明一個包含數組的結構。一個結構體是按值傳遞的,包括數組,如果你想到它,這是奇怪的(因爲結構不能是函數參數,所以當我學習C時沒有工作)。畢竟,結構很像數組,元素只是具有不同的類型。

(例如代碼,請參閱ALK的回答上面,他也較快。)

+0

「*因爲結構不可能是函數參數*」dxxm,這是真的很長...... ;-) - 反正1+在背景中錯過了我的答案。很像數組*「 - 不是真的,因爲你只是指出自己! – alk

+0

@alk這兩個都是複合類型,很明顯,具有相同類型元素的結構將(包裝)具有與數組併產生相同的訪問代碼(我懷疑)。事實上,如果C沒有結構和聯合,人們會用足夠大的元素來模擬結構,以保持最大的期望類型並命名偏移量。 –

0

此行爲是正確的:該函數的參數是允許訪問它所指向數組的值。如果你想讓原始數組保持不變,就必須在該函數內創建一個「深層副本」(即複製每個元素),或者確保獲得原始數組的副本,如其他帖子