Форум: Форум C++Разное
Новые темы: 00
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Указатели на символы и функции
 
 автор: antf   (14.11.2009 в 08:53)   письмо автору
 
 

Здравствуйте.

1. Как лучше написать функцию?

char * f(char *s = "Moia stroka")
{
  return s;
}

или
const char * f(char *s = "Moia stroka")
{
  return s;
}


2. Что значит char *s в заголовке. Создается указатель *s на некоторое значение? Тогда почему нельзя к нему обратится return *s? Или это только значит то, что параметр s передается по указателю и в теле функции ее следует писать без звездочки?

  Ответить  
 
 автор: heed   (16.11.2009 в 11:57)
 
   для: antf   (14.11.2009 в 08:53)
 

немного смогу что-то попробовать объяснить только по поводу .2

>Создается указатель *s на некоторое значение? Тогда почему нельзя к нему обратится return *s?

На самом деле в функции передаются как параметры только указатели.
В 32х-битной сиистеме указатель обычно 4 байта или 32 бита это просто величины смещения начала данных в байтах.
Все эти указатели просто копируются в стэк , откуда они будут приниматься функцией
, и передаётся управление по такому-же указателю на функцию

А возвращаются функциями в 32х-битной системе тоже только 4 байта,
вернее не столько возвращаются сколько в регистр процессора просто копируется код ошибки или 0-код успешного выполнения, или указатель на данные которые нужно вернуть.
, сами данные можно вернуть, если они умещаются в 32х-битное int
или те-же 4байта (в 32х-битной системе)

Нельзя написать return *s; потомучто так реализовано в Си.
Компилятор просто не поймёт чего от него хотят.

>Что значит char *s в заголовке
это определяет для компилятора что должно быть в регистре процессора после успешного выполнения функции. (что функция возвращает как говорят)
В виндовс и многих других системах используется регистр eax, по смыслу обозначения 32x-битный регистр-аккумулятор. Самый часто-используемый.
И некоторые операции с ним могут быть немного быстрее чем с остальными регистрами, взависимости от типа архитектуры процессора.

по поводу .1
const определяет данные как нужные только для чтения.
По поводу отличий скомпилированного кода с такими двумя способами не скажу точно
, возможно их нет, кроме того что у компилятора будет возможность ругаться по большему колличеству поводов :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования