Массив массивов не такой же, как указатель на указатель.
Причина в том, что макет памяти полностью отличается.
Для массива массивов:
+-----------+-----------+-----------+-----------+
| arr[0][0] | arr[0][1] | arr[1][0] | arr[1][1] |
+-----------+-----------+-----------+-----------+
Для указатель на указатель:
+--------+--------+-----+
| arr[0] | arr[1] | ... |
+--------+--------+-----+
| |
| V
| +-----------+-----------+-----+
| | arr[1][0] | arr[1][1] | ... |
| +-----------+-----------+-----+
V
+-----------+-----------+-----+
| arr[0][0] | arr[0][1] | ... |
+-----------+-----------+-----+
Как массивов распадается на указатель, вы можете иметь указатель на массивы, хотя:
int (*ptr)[2] = arr;
Это неопределенное поведение. – Simple
Dinesh почему вы печатаете ptr [0]? Вы хотите напечатать ptr [0] [0]? – HAL9000
Вы имеете в виду 'int * ptr'? – Jarod42