2016-12-06 47 views
0

我一直在想,如果我可以在void函數和main函數中使用相同的參數名稱。在void函數和主程序中使用相同的參數名稱

當我在void函數(int x,int y等)中使用不同名稱的參數並在程序本身中更改變量的名稱時,程序運行相同,但我不知道我是否正在處理原始變量或者只是他們的副本。

例如,如果我指定fill()函數內的整數b(一個不同的值),它將不會全局更改其值。我怎樣才能將新值賦給table和full()內的循環,並且它將在fill()和main()函數中被分配的新值可見?

void fill(int a, int b, int n, int * tab) { 
    for (int i=0; i<n; i++) { 
     tab[i] = a+rand()%(b-a+1); 
     std::cout << tab[i] << " "; 
    } 
} 

int main() { 
    srand(static_cast<unsigned int>(time(NULL))); 

    int tab[999]; 
    int n = 999; 

    int a = 4; 
    int b = 10; 

    fill(a, b, n, tab); 
    return 0; 
} 

這是我的第一篇文章,我試圖尋找在本論壇我的問題,但沒有人幫助我了。

+0

是的,你可以用同樣的在不同塊的變量名(即{})。此外,它不是一個論壇 – Incomputable

+0

你可能會感興趣http://en.cppreference.com/w/cpp/language/scope – infixed

回答

1

假設這個函數:

void changeValue(int value) { 
    ++value; 
} 

每當你對這個函數的調用,它會帶你作爲參數傳遞任何值,並將其分配給value。基本上,函數調用正在創建一個名爲value的變量,初始值將作爲您作爲參數傳遞的任何內容的評估結果。這個相同的value變量在超出作用域時將被銷燬,即,當該函數命中它的右括號或該函數將控制權返回給調用者時。因爲你所改變的是,在創建時調用函數的變量,也不會影響到任何你作爲參數傳遞,因爲:

int x{5}; 
changeValue(x); // The 'x' argument will evaluate to five when passing it as an argument 

記住,你可以通過使用表達式作爲參數傳遞給函數,例如'3'或'4 + 6'

它將評估爲相應的值,然後使用相同評估的結果初始化changeValue中的value參數。這被稱爲:「按價值傳遞」。

如果你想改變,你是作爲參數傳遞變量本身的價值,那麼你的功能應該是這個樣子:

void changeValue(int &value) { 
    ++value 
} 

當然,你將需要傳遞一個變量一個論點。這被稱爲:「通過引用傳遞」。

我建議您深入研究函數,範圍和參考,以掌握這部分語言。一些有用的鏈接:

  1. http://www.cplusplus.com/doc/tutorial/functions/
  2. http://www.cprogramming.com/tutorial/references.html
0

通過參考與&

void fill(int &a, int &b, int &n, int * tab) 

值傳遞這將通過引用,而不是拷貝傳遞,並將在主編輯原始變量。指針自動通過引用傳遞,因此標籤應該很好

+0

指針不會自動傳遞。在函數中修改'tab'不會改變調用者中的'tab'。但是,您可以修改指向指針本身是否通過引用傳遞的內容。 – stark

+0

對不起 - 這就是我的意思。按引用或通過複製傳遞指針仍將編輯原始內存地址的內容。 –

0

您需要通過引用或使用指針傳遞值;但第一種方法是比較容易

1

當你寫一個方法或函數在C++中像你這樣:

 void foo(int bar) 

你「按值調用」做了。這意味着你複製了賦給該函數的參數值,並將其賦值給一個新的變量。 如果你真的想訪問你需要「通過引用調用」做原始變量:

 void foo(int& bar) 

的另一件事情是名字:一個變量的範圍通常是{}括號內,所以範圍一個局部變量(聲明爲一個函數)始終只是一個函數。

相關問題