Читаю я книгу Либерти "Освой 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)
Объясните мне, пожалуйста, как и что происходит? Почему передаются обычные переменные, а принимаются, как указатели? На что они тут указывают, если не создавалось никаких переменных в динамической памяти? Или я вообще всё не так понимаю?
Либерти на этот счёт ничего не говорит.
Другие языки программирования и технологии
Вопрос по примеру из учебника C++
Указатель, это переменная, которая хранит адрес объекта в памяти. Совершенно не обязательно выделять по указателю память. А взять адрес можно любой переменной (объекта). Имя массива - указатель на первый элемент этого массива.
Третьим параметром в сигнатуре: ссылка. Так что buffer и word это указатели, а wordOffset - ссылка. И ничего при вызове функции, кроме идентификатора, указывать не надо. Всё!
Третьим параметром в сигнатуре: ссылка. Так что buffer и word это указатели, а wordOffset - ссылка. И ничего при вызове функции, кроме идентификатора, указывать не надо. Всё!
Ефим Николаев
Спасибо огромное!!!) Я и до темы "Ссылки" ещё не дошла.
Потому что имя массива - это почти что константный указатель на его начало (точнее, приводится к нему, есть тонкости, например, при получении размера, не буду на них останавливаться). Поэтому все равно, написать в заголовке функции, скажем, char *string, или char string[] или даже char string[ 666] - размер тут компилятор все равно проигнорирует ;)
Просто Либерти на пару микросекунд сэкономил работу компилятору, который все равно приведет char string[] к *char :)
Просто Либерти на пару микросекунд сэкономил работу компилятору, который все равно приведет char string[] к *char :)
Ефим Николаев
А, вот оно что. Я просто ещё не дошла до темы "Массивы". Спасибо большое!!!)
Массив в c/c++ -это на самом деле указатель на первый его элемент. Он даже не знает про собственную длину в рантайме.
upd: ой, сколько интеллектов набежало. Пойду-ка я лучше спать
upd: ой, сколько интеллектов набежало. Пойду-ка я лучше спать
Ефим Николаев
Спасибо большое))
Потому что есть и лучшие преподаватели:Р.Лафоре на с.427(!!!не раньше знакомства с указателями в главе 10) своего учебника пишет:
..Так как имя массива является его адресом, то нам нет необходимости использовать операцию взятия адреса & при вызове функции...
Учитесь у профессионалов, и все станет проще )).
..Так как имя массива является его адресом, то нам нет необходимости использовать операцию взятия адреса & при вызове функции...

Учитесь у профессионалов, и все станет проще )).
Ефим Николаев
Спасибо! Обязательно воспользуюсь Вашим советом.
Похожие вопросы
- Как в с++ обозначить нажатия enter? Скопировал пример из учебника, но программа не завершается, т. е не выводит ничего.
- С++ Классы, пример из учебника.
- на чем, написан c++ ? и, не пишите, что язык программирования написанн сам на себе, python к примеру написан на C .
- Приведите простой пример программы на C++.
- Вопрос тем, кто отлично знает C++
- Извините за тупой вопрос, но для чего в c++ нужны классы? Для того что бы было легко отсортировать код или ещё зачем?
- Вопрос-обсуждение. Gamedev. С# и C++. Игровые движки.
- Вопрос по функции rand srand c++
- Подскажите учебник по C++! Подскажите учебник по С++, с самого нуля. Желательно с примерами и задачками!
- Подскажите стоящий учебник по C++