Вы, возможно, обратили внимание в предыдущих "с"-прог-раммах на довольно непринужденное отношение к копированиюуказателей. В общем это верно, что на большинстве машин ука-затель можно присвоить целому и передать его обратно, не из-менив его; при этом не происходит никакого масштабированияили преобразования и ни один бит не теряется. к сожалению,это ведет к вольному обращению с функциями, возвращающимиуказатели, которые затем просто передаются другим функциям,- необходимые описания указателей часто опускаются. Рассмот-рим, например, функцию STRSAVE(S), которая копирует строку Sв некоторое место для хранения, выделяемое посредством обра-щения к функции ALLOC, и возвращает указатель на это место.Правильно она должна быть записана так: CHAR *STRSAVE(S) /* SAVE STRING S SOMEWHERE */ CHAR *S; { CHAR *P, *ALLOC(); IF ((P = ALLOC(STRLEN(S)+1)) != NULL) STRCPY(P, S); RETURN(P); } на практике существует сильное стремление опускать описания: *STRSAVE(S) /* SAVE STRING S SOMEWHERE */ { CHAR *P; IF ((P = ALLOC(STRLEN(S)+1)) != NULL) STRCPY(P, S); RETURN(P); } Эта программа будет правильно работать на многих маши-нах, потому что по умолчанию функции и аргументы имеют типINT, а указатель и целое обычно можно безопасно пересылатьтуда и обратно. Однако такой стиль программирования в своемсуществе является рискованным, поскольку зависит от деталейреализации и архитектуры машины и может привести к непра-вильным результатам на конкретном используемом вами компиля-торе. Разумнее всюду использовать полные описания. (Отладоч-ная программа LINT предупредит о таких конструкциях, еслиони по неосторожности все же появятся).