2015-08-21 36 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. 
相关问题