Этот вопрос выходит на C-гуру:
В C можно объявить указатель следующим образом:
char (* p)[10];
.., который в основном утверждает, что этот указатель указывает на массив из 10 символов. Оптимальная вещь об объявлении указателя, подобного этому, заключается в том, что вы получите ошибку времени компиляции, если попытаетесь присвоить указателю массив разного размера p. Он также даст вам ошибку времени компиляции, если вы попытаетесь присвоить значение простого указателя char для p. Я пробовал это с помощью gcc и, похоже, работал с ANSI, C89 и C99.
Мне кажется, что объявление такого указателя было бы очень полезно, особенно при передаче указателя на функцию. Обычно люди пишут прототип такой функции, как это:
void foo(char * p, int plen);
Если вы ожидали буфер определенного размера, вы просто проверили бы значение plen. Тем не менее, вам не может быть гарантировано, что человек, который передает вам p, действительно предоставит вам правильные ячейки памяти в этом буфере. Вы должны верить, что человек, который вызвал эту функцию, поступает правильно. С другой стороны:
void foo(char (*p)[10]);
.. заставит вызывающего пользователя предоставить вам буфер указанного размера.
Это кажется очень полезным, но я никогда не видел указателя, объявленного таким образом в любом коде, который я когда-либо встречал.
Мой вопрос: есть ли причина, почему люди не объявляют такие указатели? Не вижу ли я какой-то очевидной ловушки?