Автор: heed (16.11.2009 в 11:57)
немного смогу что-то попробовать объяснить только по поводу .2
>Создается указатель *s на некоторое значение? Тогда почему нельзя к нему обратится return *s?
На самом деле в функции передаются как параметры только указатели.
В 32х-битной сиистеме указатель обычно 4 байта или 32 бита это просто величины смещения начала данных в байтах.
Все эти указатели просто копируются в стэк , откуда они будут приниматься функцией
, и передаётся управление по такому-же указателю на функцию
А возвращаются функциями в 32х-битной системе тоже только 4 байта,
вернее не столько возвращаются сколько в регистр процессора просто копируется код ошибки или 0-код успешного выполнения, или указатель на данные которые нужно вернуть.
, сами данные можно вернуть, если они умещаются в 32х-битное int
или те-же 4байта (в 32х-битной системе)
Нельзя написать return *s; потомучто так реализовано в Си.
Компилятор просто не поймёт чего от него хотят.
>Что значит char *s в заголовке
это определяет для компилятора что должно быть в регистре процессора после успешного выполнения функции. (что функция возвращает как говорят)
В виндовс и многих других системах используется регистр eax, по смыслу обозначения 32x-битный регистр-аккумулятор. Самый часто-используемый.
И некоторые операции с ним могут быть немного быстрее чем с остальными регистрами, взависимости от типа архитектуры процессора.
по поводу .1
const определяет данные как нужные только для чтения.
По поводу отличий скомпилированного кода с такими двумя способами не скажу точно
, возможно их нет, кроме того что у компилятора будет возможность ругаться по большему колличеству поводов :)