This works:
void foo(int (&a)[3]) {
    auto ibegin = begin(a);
    auto ebegin = end(a);
}
While this doesn't:
void foo(int (*a)[3]) {
    auto ibegin = begin(a);
    auto ebegin = end(a);
}
I consider int (&a)[3] and int (*a)[3] have the same meaning! 
 
     
     
     
     
    