Я знаю, что следующее неверно:
int arr[2][3] = {}; //some array initialization here
int** ptr;
ptr = arr;
Но я очень удивлен, что на самом деле работают следующие строки
int arr[2][3] = {}; //some array initialization here
auto ptr = arr;
int another_arr[2][3] = {}; //some array initialization here
ptr = another_arr;
Может ли кто-нибудь объяснить, что такое тип, назначенный ptr во втором блоке кода, и что произошло под ним?