int (*p)[3];
- это массив указателей на int
.
int a[3]={10,11,12};
- это массив int
.Массивы и указатели имеют много общих свойств.Вы можете использовать обозначение массива для указателей, например.
Давайте возьмем нормальный указатель int *p = a
, который совпадает с int *p = &a[0]
.Теперь указатель указывает на первый элемент массива.И вы можете использовать его так же, как и массив.
printf("%d\n", p[0]); //10
printf("%d\n", p[1]); //11
printf("%d\n", p[2]); //12
То, что вы сделали, получило адрес массива - «указатель», это даст адрес первого элемента массива.Потому что &a == a
Это записывается в первый элемент вашего массива указателей, оставляя вам
p[0] == a
p[1] == unknown
p[2] == unknown
, выполнив *p[0]
, вы получите первый элемент p (p[0]
)и разыменование это *
.Это то же самое, что и *a
или a[0]
.
Но, выполнив *p[1]
, вы попадете в неизвестную область памяти (p[1]
) и отмените ее защиту *
.Это неопределенное поведение.