[Ответ скопирован с дубликата, теперь удаленного вопроса .]
time()
- очень, очень старая функция. Это восходит к тому дню, когда язык Си даже не имел типа long
. Давным-давно, единственный способ получить что-то похожее на 32-битный тип - это использовать массив из двух int
s - и тогда int
s были 16 битами.
Так вы позвонили
int now[2];
time(now);
и он заполнил 32-битное время до now[0]
и now[1]
, 16 бит за раз. (Это объясняет, почему другие связанные со временем функции, такие как localtime
и ctime
, также склонны принимать свои аргументы времени через указатели.)
Позже dmr завершил добавление long
к компилятору, чтобы вы могли начать говорить
long now;
time(&now);
Еще позже кто-то понял, что было бы полезно, если бы time()
пошел дальше и вернул значение, а не просто заполнил его через указатель. Но - обратная совместимость - замечательная вещь - в интересах всего кода, который все еще выполнял time(&now)
, функция time()
должна была поддерживать аргумент указателя. Вот почему - и именно поэтому обратная совместимость не всегда такая замечательная вещь - если вы используете возвращаемое значение, вы все равно должны передать NULL в качестве указателя:
long now = time(NULL);
(Позже, конечно, мы начали использовать time_t
вместо обычного long
для времен, так что, например, его можно изменить на 64-битный тип, уклонившись от y2.038k проблема .)
[P.S. На самом деле я не уверен, что изменение с int [2]
на long
и изменение добавления возвращаемого значения происходили в разное время; они могли произойти одновременно. Но обратите внимание, что когда время было представлено в виде массива, оно имело для заполнения через указатель, оно не могло быть возвращено как значение, потому что функции C, конечно, не могут возвращать массивы.]