A 2D array is a contiguous block of memory. When accessing it as a 2D array you need row length to jump from column to column. A pointer to a pointer is exactly that. It can simulate a 2D array if the first pointer is an array of pointers to a second dimension of arrays but it is a very different beast to the contiguous block of memory that a 2D array is.