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