Ответ 1
Это общий трюк, чтобы сделать "ссылочный тип" в C, где использование его в качестве аргумента функции приводит к тому, что один элементный массив деградирует к указателю на его первый элемент без необходимости программиста, явно использующего &
оператора, чтобы получить его адрес. Если объявлено, это реальный тип стека (не требуется динамического выделения), но при передаче в качестве аргумента вызываемая функция получает указатель на него, а не копию, поэтому она прошла дешево (и может быть изменена вызываемой функцией, если нет const
).
GMP использует тот же трюк со своим типом mpz_t
, и он там критичен, потому что структура управляет указателем на динамически распределенную память; функция mpz_init
полагается на получение указателя на структуру, а не на ее копию, или вообще не может ее инициализировать. Аналогичным образом, многие операции могут изменять размер динамически распределенной памяти, и это не сработает, если они не смогут изменить структуру вызывающего объекта.