#include<iterator>
#include<iostream>
int a[5][4];
int main()
{
cout << *begin(a);
}
Why this cout will print the same as begin(a).
It seems the * does not dereferencing the pointer return by begin(a) ?
Can anyone tell me why?
CodePudding user response:
Here * affects only the type of the pointer, and not its numerical value.
std::begin(a) returns a pointer to the first element of a, of type int (*)[4] (pointer to an array of 4 ints).
*std::begin(a) returns int[4]. Since cout can't print arrays directly, the array then decays to the pointer to its first element, of type int *, and is printed as such.
**std::begin(a) would return an int.
CodePudding user response:
You have a two-dimensional array
int a[5][4];
Its elements in turn one-dimensional arrays of the type int[4].
The expression *begin( a ) yields a reference to the first element of the array of the type int ( & )[4]. Used in this statement
cout << *begin(a);
the expression is implicitly converted to a pointer to its first element of the type int * and equivalent to &a[0][0].
On the other hand the expression begin( a ) has the type int ( * )[4].
The address of the whole two-dimensional array coincides with the address of its first element, one dimensional array, that in turn coincides with the address of the first element of the one-dimensional array. though the used expressions have different types.
