Указатель массива, используемый в выражениях, таких как, например, инициализатор, неявно преобразуется в указатель на его первый элемент.
Так что, если у вас есть такой массив
int var6[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
, тогда это объявление объявляет массив из 3 элементов типа int[4]
. Таким образом, указатель на элемент массива будет иметь тип int ( * )[4]
, и вы можете написать
int (*ptr62)[4] = var6;
Если вы напишите
ptr62 = &var6;
, вы получите ошибку компилятора, потому что слева На стороне стороны присваивания находится объект типа int( * )[4]
, в то время как на правой стороне находится объект типа int( * )[3][4]
, и эти типы не совместимы, и не существует неявного преобразования из одного типа в другой.
Если вы хотите объявить указатель на весь массив, имеющий тип int[3][4]
, тогда такой указатель будет иметь тип int ( * )[3][4]
, и вы можете написать
int (*ptr61)[3][4] = &var6;
Что касается этого объявление
int (*ptr61)[][4] = &var6;
, затем оно объявляет указатель на неполный тип массива int[][4]
.