2014-01-28 89 views
-1

爲什麼會出現在結果的差時,我打電話的空隙函數內部的陣列,並且當我調用的空隙函數內標:差異結果

傳遞數組成void函數:

#include <iostream> 
const int n_cells = 1; 
using namespace std; 

void function1(int c[n_cells], int a, int b) 
{ 
    c[0] = a + b; 
} 

int main(){ 
    int a = 3; 
    int b = 4; 
    int c[n_cells]; 
    function1(c, a, b); 
    cout<<"c = "<<c[0]; 

    return 1; 
} 

結果:

C = 7

傳遞一個標量成void函數

#include <iostream> 

using namespace std; 

void function1(int c, int a, int b) 
{ 
    c = a + b; 
} 

int main(){ 
    int a = 3; 
    int b = 4; 
    int c; 
    function1(c, a, b); 
    cout<<"c = "<<c; 

    return 1; 
} 

結果:

C = 2130567168 //一些垃圾值

P.S.對於爲什麼我每次收到與上面給出的相同垃圾價值的任何評論?

+0

編譯時打開警告。如果您使用的是GCC,請以「-Wmost」開頭。一個好的編譯器會警告你在第二個程序中'c'未初始化。 –

回答

3
void function1(int c[n_cells], int a, int b) 

有效地將指針傳遞給調用者的數組。然後function1在調用者的數組上運行,這意味着調用者可以使用任何更新。

void function1(int c, int a, int b) 

通過的c副本。它無法訪問調用者的變量,因此無法更新它。 main從未分配過c因此您打印出未初始化的值。

如果要更新一個整數參數,您可以通過引用傳遞它,而不是

void function1(int& c, int a, int b) 
//    ^

,而不是傳遞呼叫者的c的副本,這個現在將指針傳遞給調用者的變量,允許function1到更新它。

1

數組參數實際上轉換爲類型int*,所以您實際上正在做的是將指針傳遞給在main中聲明的數組的第一個元素。因此,當您分配給此數組的第一個元素時,您正在修改main中的數組。

但是,當您通過int時,將int複製到該函數中並修改該副本。此修改將不會在main中看到。

1

你可以得到同樣的結果在第二個方案,如果當你傳遞一個數組的值是由編譯器隱式轉換爲指向它第一個元素,你會定義功能通過以下方式

void function1(int *c, int a, int b) 
{ 
    c[0] = a + b; 
} 

。所以這些函數聲明是等價的並且聲明相同的函數

void function1(int c[n_cells], int a, int b); 
void function1(int c[10], int a, int b); 
void function1(int c[], int a, int b); 
void function1(int *c, int a, int b); 

將最後一個聲明與我向第二個程序展示的聲明進行比較。

在第二個程序中,該函數獲取其參數的副本。它的參數是函數的局部變量。因此,在退出本地變量將被銷燬的函數後,該局部變量的任何更改都將被丟棄。

在第一個程序中,該函數獲取數組的第一個元素的地址。它在這個地址進行更改。所以原始數組的相應元素將會改變。