Другие языки программирования и технологии

Вопрос по примеру из учебника C++

Читаю я книгу Либерти "Освой C++..", и есть там на странице 228 пункт "Вычисления с указателями" и пример программы по теме.
До сих пор этот учебник меня очень радовал простотой и доступностью изложения. Теперь же внезапно откуда-то взялось много новых и не прокомментированных штук. Надеюсь, с большинством из них я разберусь в ходе дальнейшего чтения. Но кое с чем, кажется, надо разобраться прямо сейчас.

В главной функции создаются переменные:

const int bufferSize=255;
char buffer[bufferSize+1];
char word[bufferSize+1];
int wordOffset=0;

Потом они передаются как параметры другой функции:

while(GetWord(buffer, word, wordOffset))
...
...

Функция выглядит так:

bool GetWord (char *string, char *word, int &wordOffset)

Объясните мне, пожалуйста, как и что происходит? Почему передаются обычные переменные, а принимаются, как указатели? На что они тут указывают, если не создавалось никаких переменных в динамической памяти? Или я вообще всё не так понимаю?
Либерти на этот счёт ничего не говорит.
Ефим Николаев
Ефим Николаев
5 459
Указатель, это переменная, которая хранит адрес объекта в памяти. Совершенно не обязательно выделять по указателю память. А взять адрес можно любой переменной (объекта). Имя массива - указатель на первый элемент этого массива.
Третьим параметром в сигнатуре: ссылка. Так что buffer и word это указатели, а wordOffset - ссылка. И ничего при вызове функции, кроме идентификатора, указывать не надо. Всё!
Гл Спец Агроном Рабочая Почта
Гл Спец Агроном Рабочая Почта
66 235
Лучший ответ
Ефим Николаев Спасибо огромное!!!) Я и до темы "Ссылки" ещё не дошла.
Потому что имя массива - это почти что константный указатель на его начало (точнее, приводится к нему, есть тонкости, например, при получении размера, не буду на них останавливаться). Поэтому все равно, написать в заголовке функции, скажем, char *string, или char string[] или даже char string[ 666] - размер тут компилятор все равно проигнорирует ;)
Просто Либерти на пару микросекунд сэкономил работу компилятору, который все равно приведет char string[] к *char :)
Ефим Николаев А, вот оно что. Я просто ещё не дошла до темы "Массивы". Спасибо большое!!!)
Массив в c/c++ -это на самом деле указатель на первый его элемент. Он даже не знает про собственную длину в рантайме.
upd: ой, сколько интеллектов набежало. Пойду-ка я лучше спать
SI
Sergej Ivanov
37 746
Ефим Николаев Спасибо большое))
Потому что есть и лучшие преподаватели:Р.Лафоре на с.427(!!!не раньше знакомства с указателями в главе 10) своего учебника пишет:
..Так как имя массива является его адресом, то нам нет необходимости использовать операцию взятия адреса & при вызове функции...
Учитесь у профессионалов, и все станет проще )).
Roma Perelovsky
Roma Perelovsky
35 996
Ефим Николаев Спасибо! Обязательно воспользуюсь Вашим советом.