Почему указатель на указатель несовместим с указателем на массив?

Хорошо, у меня проблемы с пониманием указателей на указатели и указателей на массивы. Рассмотрим следующий код:

char s[] = "Hello, World";
char (*p1)[] = &s;
char **p2 = &s;
printf("%c\n", **p1); /* Works */
printf("%c\n", **p2); /* Segmentation fault */

Почему первый printf работает, а второй - нет. 't?

Насколько я понимаю,' s '- это указатель на первый элемент массива (то есть' H '). Таким образом, объявление p2 как char ** означает, что это указатель на указатель на char. Указание на 's' должно быть законным, поскольку 's' является указателем на char. Таким образом, разыменование (т.е. ** p2) должно давать "H". Но это не так!

12
задан ildjarn 27 October 2011 в 23:23
поделиться