内置数组类型的开始和结束函数

时间:2015-08-21 15:21:18

标签: c++ arrays pointers

我正在尝试为一个C风格的字符串数组(一个指向char的指针数组)获取一个开始和一个结束指针。 为什么我不能调用开始和结束函数来获取它们?

#include <iostream>
#include <iterator>

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

编译器说我对begin(char**&)

的调用没有匹配功能

2 个答案:

答案 0 :(得分:6)

这些函数应用于数组。 至于参数argv,它实际上有类型char **,因为按值传递的数组将转换为指向其第一个元素的指针,参数也会调整为指针。

你可以写简单

#include <iostream>
#include <iterator>

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

如果函数将相应的参数声明为对数组的引用,则可以使用函数std :: begin和std :: end。例如

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.

答案 1 :(得分: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;
}