Const правильность для указателей массива?
Кто-то привел аргумент, сказав, что в современном C мы всегда должны передавать массивы в функции через указатель массива, поскольку указатели массива имеют строгую типизацию. Пример:
void func (size_t n, int (*arr)[n]);
...
int array [3];
func(3, &array);
Это звучало так, как будто это может быть хорошей идеей для предотвращения всевозможных ошибок, связанных с типами и массивами. Но потом мне пришло в голову, я не знаю, как применить к этому константность.
Если я сделаюvoid func (size_t n, const int (*arr)[n])
тогда это правильно. Но тогда я больше не могу передать массив из-за несовместимых типов указателей.int (*)[3]
противconst int (*)[3]
, Квалификатор относится к указанным данным, а не к самому указателю.
Явное приведение в вызывающей стороне разрушило бы всю идею повышенной безопасности типов.
Как применить константную корректность к указателям массива, переданным в качестве параметров? Это вообще возможно?
РЕДАКТИРОВАТЬ
Точно так же, как информация, кто-то сказал, что идея передачи массивов указателем, подобным этому, вероятно, возникла из MISRA C ++: 2008 5-2-12. Смотри напримерPRQA высокий стандарт C ++.