The functions are applied to arrays.
As for the parameter argv then it actually has type char ** because arrays passed by value are converted to pointers to their first elements and parameters are adjusted also to pointers.
You could write simply
#include <iostream>
#include <iterator>
int main(int argc,char *argv[])
{
auto first = arg, last = argv + argc;
}
You could use the functions std::begin and std::end if your function declares the corresponding parameter as reference to array. For example
int MyMain( char * ( &argv )[10] )
{
auto first = std::begin( argv ), last = std::end( argv );
}
Nevertheless it is the same if to write
auto first = argv, last = argv + 10;
Here is how the functions are defined in the C++ Standard
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.
char *argv[]is adjusted to a pointer,char **argv, it only looks like an arraystd::beginneeds an actual array.