Давайте начнем с обсуждения правового кода. То, что вы написали (предполагая символ перед каждой декларацией), не будет компилироваться по нескольким причинам: у вас слишком много инициализаторов (шесть символов для arr [0], а его размер равен 5) и, конечно, char ** p не имеет типа, совместимого с char arr [2] [5]. Исправляя эти проблемы, получаем:
char arr[2][6] = { "hello", "hai" };
char (*p)[6] = arr;
Без какого-либо двойного указателя. Если вы хотите получить доступ к одиночным символам в приведенном выше примере, вам нужно указать элемент, из которого они пришли:
char* pc = *arr;
будет работать, если вы хотите получить доступ к символам из первого элемента в обр.
C ++ не имеет двухмерных массивов. Первое определение выше определяет массив [2] или массив [6] символа. Массив implicite для преобразования указателя приводит к указателю на массив [6] символа. После этого, конечно, нет никакого массива для преобразования указателя, потому что у вас больше нет массива.