2011-05-25 78 views
1

當使用簡單變量名作爲傳遞給函數的參數時,該函數取對應於此變量名的值,並將其作爲新變量安裝到由函數創建的新內存位置中那個目的。但是當數組的地址作爲參數傳遞給函數時會發生什麼?該函數是否會在調用程序中創建另一個數組並將其從數組中移入數值中?C數組問題

回答

4

不,如果您將某個地址傳遞給某個函數,該函數將獲取該地址。從技術上講,它得到一個拷貝的地址(它的所有傳值,我們只是使用指針來模擬通過引用),所以,如果你改變函數內的地址,那沒有任何影響在返回。

通過取消引用地址,您可以更改它指向的內容。例如:

void changeValA (int x) { 
    x = 42;     // x is 42 but a is unchanged. 
} 
void changeValB (int *x) { 
    *x = 42;     // *x (hence a) is now 42 
} 
: 
int a = 31415;    // a is 31415 
changeValA (a);    // a is still 31415 
changeValB (&a);    // a is now 42 

傳遞一個陣列的地址是幾乎相同傳遞數組本身。在這種情況下,陣列衰減到其第一個元素的地址。

+0

那就好了。我會停止輸入我的答案;) – 2011-05-25 07:27:22

+0

@Demian布萊希特哦,我明白了。因此,不是傳遞數組中的值,而只傳遞數組的*地址*。 Ahmmm函數然後可以使用該地址訪問*原始*數組? – aer 2011-05-25 07:30:46

+1

@aerohn:是的,這就是你如何在舊式C中進行傳遞引用。希望在下一個ISO標準中,我們將得到C++'void changeValC(int&x){x = 42; } ... changeValC(a);'參考類型和C中最新鮮的不友好的位之一將退役:-) – paxdiablo 2011-05-25 07:35:04

-1

當你傳遞一個數組的地址時(我相信你正在談論指針),指針的副本被傳遞給函數。

0

地址的數值將被複制到堆棧中,而不是地址指向的內存空間!

0

數組的名稱可以視爲指向其開始的指針。所以當你將數組傳遞給一個函數時,就好像你正在傳遞一個指針。沒有新的數組被創建。

0

編號 只有數組的引用/地址會去。 因此,數組中函數的任何更新都會影響傳遞的數組。

0

在C中,數組總是按引用傳遞(即只傳遞指向其開始的指針)。

如果你真的想按值傳遞一個數組,你可以把它包裝在一個結構體中,並傳遞結構體。沒有其他方法可以按值傳遞數組。

1

當一個陣列被傳遞到功能

號,它衰變的指針數組的第一元件。這允許函數像原始代碼一樣訪問數組元素,包括修改傳遞指向函數的元素的能力,但失去了使用sizeof知道數組編譯時間大小的能力。

基本上,這個:

void func(int a[]); 

// ... 

int i[] = { 0, 1, 2, 3, 4 }; 
func(i); 

有效地這樣做:

void func(int *a); 

// ... 

int i[] = { 0, 1, 2, 3, 4 }; 
func(& (i[0])); 

注意函數接收數組有沒有辦法知道它是因爲這個有多長的路。這就是爲什麼幾乎所有采用數組(或指針)的函數都需要一個大小參數。