2011-09-24 81 views
0

基本上,假設我在int main()中聲明瞭一個數組,然後將它傳遞給另一個函數,那麼我可以更改數組保存的值了嗎?喜歡的東西:將數組傳遞給函數,然後更改值?

int main() 
{ 
    myarray[3] = {4, 5, 6}; 

    myfunc(myarray); 

return 0; 
} 

int myfunc(int myarray[]) 
{ 
    int x 
    cout << "Choose a number"; 
    cin >> x 

    if (x == 1) 
    { 
    myarray[] = {0, 1, 3} 
    } 
    else 
    { 
    some code 
    } 

return 6; 
} 

此代碼顯然不能編譯,但我真的不能想到的任何其他方式來改變函數內的數組中的值。

回答

0
if (x == 1) 
{ 
    myarray[] = {0, 1, 3} // {0,1,3} is an initializer list. 
} 

初始化列表只允許在聲明點。他們不被允許在任務中。在if語句中,你正在做一個任務。修改數組元素的唯一方法是更改​​if中每個索引處的元素。

myarray[0] = 0; 
myarray[1] = 1; 
myarray[2] = 3; 
0

這是:myarray[] = {0, 1, 3} - 是錯誤的。

您應該傳遞數組的長度,然後運行一個會更改其值的循環。

您不應該假設您在函數中獲得的數組大小。如果大小不變 - 使其爲myfunc(int myarray[THE_SIZE]),否則必須爲myfunc(int myarray[], int size),其中size是傳遞數組的大小。

3

您可以修改數組中的元素然而初始化列表如下:

myarray[] = {0, 1, 3} 

只能在聲明數組中。要分配給陣列,您必須分別分配每個元素:

myarray[0] = 0; 
myarray[1] = 1; 
myarray[2] = 3; 
1

使用現有的函數簽名無法安全地更改值。通常情況下,你倒是不喜歡

myarray[0] = 0; 
myarray[1] = 1; 
//etc 

的東西還有很多其他的方法,以接近這也取決於這些值如何進入陣列存儲(或者std::copystd::generate可能會派上用場這裏)。但現在你無法知道數組在哪裏結束。

要修改這個,你需要以某種方式將數組的長度傳遞給函數。一種方法是簡單地傳遞一個額外的size_t length參數。在C++中迭代的精神的作品可以說是更好的方法是編寫簽名像

int myfunc(int* begin, int* end); 

,並用東西把它像

myarray[3] = {4, 5, 6}; 
myfunc(myarray, myarray + sizeof(myarray)/sizeof(myarray[0]));