2014-03-01 44 views
0

據我所知,在C++中,當您將非指針對象傳遞給方法時,它會在方法中使用它的副本。但是,在我的程序下面,我傳遞了一個副本,但我的方法實際上是編輯原始字符數組。爲什麼這個工作? :/將數組傳遞給C++中的方法

#include <iostream> 
#include <string> 
void Reverse(char s[], int sizeOfArray) 
{ 
    for (int i = 0 ; i < sizeOfArray; i++) 
    { 
     s[i] = 'f'; 
    } 

} 
int main() 
{ 
    char c[3] = {'g','t','r'}; 
    Reverse(c,3); 
    for (int t = 0 ; t < 3; t++) 
    { 
     std::cout << c[t]; 
    } 
    return 0; 
} 

注:

輸出是FFF

+0

因爲在C++中,數組是_not objects_。它可以處理包含數組的類和結構類型,這正是C++ 11的'std :: array'所在。 –

+0

在附註上,這與C中的相同。在C中,通過指針傳遞結構是常見的,但它們也可以通過值傳遞。 –

+0

@JanHudec取決於你如何定義術語「對象」。根據C++標準,數組絕對是對象。 – fredoverflow

回答

-1

如果聲明一個數組則變量保存數組的基地址,所以在這裏char c[3]裝置c保持的基地址陣列c[3]

所以,當你通過Reverse(c,3);實際上你傳遞的是基地址。

0

空隙反向(個char [],INT sizeOfArray)

反向(C,3);

>呼叫由值

>呼叫通過引用

這裏你正在做通過引用操作,這意味着要傳遞的C地址的int []

呼叫

您正在傳遞c的引用來反轉函數。這被稱爲引用調用而不是按值調用。這就是爲什麼反轉功能覆蓋原來的輸入

2

您不能通過將數組傳遞給函數來複制數組。數組「衰減」成指針。檢查自己通過打印變量的typeid:

#include <iostream> 
#include <string> 
void Reverse(char s[], int sizeOfArray) 
{ 
    std::cout << typeid(s).name() << "\n"; 
    for (int i = 0 ; i < sizeOfArray; i++) 
    { 
     s[i] = 'f'; 
    } 

} 
int main() 
{ 
    char c[3] = {'g','t','r'}; 
    std::cout << typeid(c).name() << "\n"; 
    Reverse(c,3); 
    for (int t = 0 ; t < 3; t++) 
    { 
     std::cout << c[t]; 
    } 
    return 0; 
} 

結果:

故事
char [3] 
char * 

道德:

使用std::vector


編輯:我要提的是,typeid的確切的結果是實現定義的。 「char [3]」和「char *」是我用VC 2013得到的結果。當然,每個編譯器的基本問題都是一樣的。

+2

或在C++ 11中使用std :: array(如果你想要一個修復大小的數組) – KoKuToru

+0

是的,但我仍然認爲應該使用std :: vector如果沒有特殊要求,並且只考慮std :: array這是必要的(但是,在所有情況下,它比原始數組中的99%更好)。 –

0

因爲char s[]實際上是指向數組的第一個元素的char *。 這意味着你的函數Reverse獲取第一個arg指針,但不是數組的副本。

如果你想獲得副本,你應該首先使用memcpy並傳遞新的(複製)數組來運行。

0

C數組無法通過複製傳遞。

它可以通過參考作爲你void Reverse(char a[], int size) (這是一樣的void Reverse(char* a, int size))原樣傳遞void Reverse(char (&a)[3])
或通過其衰變指針。

您可以使用std::array(C++ 11)來更直觀的行爲。