Если вы напишите
void f(int a[4]);
, который имеет точно то же значение для компилятора, как если бы вы написали
void f(int *a);
Вот почему у Линуса такое мнение. [4]
выглядит как , оно определяет ожидаемый размер массива, но это не так. Несоответствие между тем, как выглядит код, и тем, что он на самом деле означает, очень плохо, когда вы пытаетесь поддерживать большую и сложную программу.
(В общем, я советую людям , а не предполагать, что мнения Линуса верны. В этом случае я согласен с ним, но я бы не сказал это так злобно.)
Начиная с C99, существует вариант, который означает , что означает, что он выглядит так:
void f(int a[static 4]);
То есть все вызывающие f
обязаны указывать на массив не менее четырех int
с; если они этого не делают, программа имеет неопределенное поведение. Это может помочь оптимизатору, по крайней мере, в принципе (например, это может означать, что цикл над a[i]
внутри f
может быть векторизован).
Ваш альтернативный конструкт
void f(int (*a)[4]);
дает параметру a
другой тип («указатель на массив 4 int» вместо «указатель на int»). Эквивалент обозначений массива этого типа
void f(int a[][4]);
Таким образом, должно быть ясно, что это объявление подходит, когда аргументом f
является двумерный массив , внутренний размер которого равен 4, но не иначе.
sizeof
проблемы - еще одна банка червей; Я рекомендую избегать необходимости использовать sizeof
для аргументов функции практически любой ценой. не искажайте список параметров функции, чтобы sizeof
выходил "прямо" из функции; это затрудняет правильный вызов функции, и вы, вероятно, вызываете функцию намного чаще, чем реализуете ее.