2015-08-21 31 views
4

我想獲得一個開始和一個關閉C型字符串(指向char的指針數組)的結束指針。 爲什麼我不能調用begin和end函數來獲取它們?內置陣列類型的開始和結束函數

#include <iostream> 
#include <iterator> 

int main(int argc,char *argv[]) 
{ 
    char **first=std::begin(argv),**last=std::end(argv); 
} 

編譯器說,有我的電話沒有匹配功能begin(char**&)

+2

'的char * argv的[]'調整爲指針,'字符** argv',它只是看起來像一個數組 –

+0

@PiotrSkotnicki不所有數組轉換爲指針?是不是整個轉換點,能夠將「數組」傳遞給函數?所以I0m傳遞一個指向開始和結束函數的指針,它不應該工作嗎? – Luca

+2

@Luca您可以通過引用或指向數組的指針將數組傳遞給函數,而不是通過值。傳遞一個指針和一個數組是有區別的,而'std :: begin'需要一個實際的數組。 –

回答

1

問題,編譯器的面,是定義它無法猜測argv的大小,因爲它不是一個數組,而是一個單純的指針。

數組總是可以用作指針,因爲數組可以將衰減指向它的第一個元素。但反過來是錯誤的!您可以通過數組或通過指針完全一樣訪問數組的元素,但指針和數組是不一樣的

int a[5]; 
int *p = a; // p[i] and a[i] are now the same 
size_t s = sizeof(a); // s is 5 * sizeof(int) 20 on common (32 bits) architectures 
size_t s2 = sizeof(p); // s2 is just sizeof(int *) 4 on 32 bits architecture 

約定說的argv有argc個元素(並且argv [argc]是一個空指針)。但std::beginstd::end不使用該慣例。所以做用手作爲一個很好的程序員:

#include <iostream> 
#include <iterator> 

int main(int argc,char *argv[]) 
{ 
    char **first=argv,**last=argv + argc; 
} 
6

功能被應用到陣列。 至於參數argv,那麼它實際上有類型char **,因爲按值傳遞的數組被轉換爲指向其第一個元素的指針,並且參數也被調整爲指針。

你可以寫簡單

#include <iostream> 
#include <iterator> 

int main(int argc,char *argv[]) 
{ 
    auto first = arg, last = argv + argc; 
} 

您可以使用功能的std ::開始和std ::結束時,如果你的函數聲明對應的參數作爲參考陣列。例如

int MyMain(char * (&argv)[10]) 
{ 
    auto first = std::begin(argv), last = std::end(argv); 
} 

儘管如此,它是相同的,如果寫

auto first = argv, last = argv + 10; 

這裏是函數是如何在C++標準

template <class T, size_t N> T* begin(T (&array)[N]); 
4 Returns: array. 

template <class T, size_t N> T* end(T (&array)[N]); 
5 Returns: array + N. 
相關問題