В C возможно typedef
массив, используя эту конструкцию:
typedef int table_t[N];
Здесь table_t
теперь определяется как массив из N int
. Любая переменная, объявленная как table_t t;
, теперь будет вести себя как обычный массив int
.
Точка такой конструкции должна использоваться как тип аргумента в функции, например:
int doSomething(table_t t);
Возможно, был прототип относительно эквивалентной функции:
int doSomething(int* t);
Достоинство первой конструкции состоит в том, что она обеспечивает N
как размер таблицы. Во многих случаях безопаснее применять это свойство, а не полагаться на программиста, чтобы правильно определить это условие.
Теперь все хорошо, кроме этого, чтобы гарантировать, что содержимое таблицы не будет изменено, необходимо использовать квалификатор const
.
Следующее утверждение относительно просто понять:
int doSomething(const int* t);
Теперь doSomething
гарантирует, что он не будет изменять содержимое таблицы, переданной как указатель.
Итак, как насчет этой почти эквивалентной конструкции?
int doSomething(const table_t t);
Что здесь const
? содержимое таблицы или указатель на таблицу?
Если это указатель const
, существует ли другой способ (совместимый с C90), чтобы сохранить возможность определять размер таблицы и сообщить, что ее содержимое будет const?
Обратите внимание, что иногда необходимо изменить содержимое таблицы, поэтому свойство const
не может быть встроено в определение typedef.
[Edit] Спасибо за отличные ответы, полученные до сих пор. Подводя итог:
- Исходное предположение о принудительном применении размера typedef N было совершенно неверным. Он в основном ведет себя так же, как обычный указатель.
- Свойство
const
также будет вести себя так же, как если бы оно было указателем (резко контрастирует с typedef с типом указателя, как подчеркивается @random ниже) - Чтобы обеспечить размер (который не был начальным вопросом, но в конечном итоге сейчас очень важно...), см. ответ Джонатана