Главная » Просмотр файлов » Г. Шилдт - Полный справочник по C++

Г. Шилдт - Полный справочник по C++ (1109478), страница 25

Файл №1109478 Г. Шилдт - Полный справочник по C++ (Г. Шилдт - Полный справочник по C++) 25 страницаГ. Шилдт - Полный справочник по C++ (1109478) страница 252019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 25)

Переменная, прсдставляктшая собой указатель на указатель. объявляется слелуюшим образом: перел сс именем записывается дополнительная звездочка. Например, в следуюшем операторе переменная пемъа1апсе объявляется как указатель на указа- сль на число с птзваюшей точкой. й с1оае **пеыЬа1апсе Следует помнить, что переменная пемьвъапее не является указателем на число ; плаваюшсй точкой, она лишь ссылается на указатель этого типа.

Глава б. Указатели ул Чтобы извлечь значение переменной с помощью косвенной адресации, необходи. мо дважды применить оператор разыменования. Еьпс1иде своего.п> зпс азатп(оо1о) опт х, "р, **с)з х = 10з )3 = йхз с) = арз рт1птт("ьс)', **ц); /* вывод числа х */ те) цтп Оз ) Здесь переменная р объявлена как целочисленный указатель, а переменная о прел ставляет собой указатель на целочисленный указатель.

Функция рт1пет () выволит на зкран число Нй ~~~ Инициализация указателей Если нестатический локальный указатель объявлен, но не инициализирован, его значение остается неопределенным. (Глобальные и статические локальньш указатели автоматически инициализируются нулем.) При попытке применить указатель, содержащий неопределенный адрес, может разрушиться как программа, так и вся операционная система — хуже нс придумаешь! При работе с указателями большинство профессиональных программистов на языке С/С++ придерживаются следующего соглашения: указатель, не ссьпающиися па конкретную ячейку памяти, должен быть равен нулю.

По определению любой нулевой указа~ель ни на что не ссылается и не должен использоваться. Однако зто ешс не гарантирует безопасности. Использование нулевого указателя — всего лишь общепринятое соглашение. Это вовсе нс правило, диктуемое языком С или С++.

Например, если нулсвои указатель поместить в левую чань оператора присваивания, риск раз. рушсния программы и операционной системы остае~ся высоким. Поскольку предполагается, что нулевой указатель в вычислениях не используется, его можно применять для повышения наглялности и эффективности программ. Например, его можно использовать в казестве признака конца массива, содержащего указатели.

Это позволит предотвратить выход за пределы допустимого диапазона. Подобная ситуация иллюстрируется на примере функции велте)з(). /' Поиск имени */ 1пт веатсц(спет *р(), с)зат *палзе) тесззесет зп тот(с-Сз р(т)з ++с) 1Е(!естслзр(р[т], пате)) тесптп ез тетитп -1; /* имя не найдено */ Цикл вот внутри функции вевтс)з() выполняется до тех пор, пока не будет найдено требуемое имя, либо нс обнаружится нулевой указатель.

Как только нулевой указатель Часть!. Основм языка С++с подмножества С будет обнаружен. условие цикла станет ложным. и программа передаст управление следующему оператору. Программисты на С/С+э часто инициализируют строки. Пример такой инициализации приведен в функции вупеек еггогО из раздела "Массивы указателей". Рассмозрим еще один вариант инициализации строки в момент объявления. й сбег *р = "Здравствуйте"; Как яидим, указатель р не является массивом.

Попробуем понять, почему возможен такой способ инициализации. Все кол)пиляторы языка С/С++ созлдют так называемую таблицу строк (з(ппй (аЫе), в которой хранятся строковые константы, используемыс в программе. Следовательно, предыдущий оператор присвоит указателю р адрес строковой константы "Здравствуйте", записанной в таблицу строк. Указатель р используется в программе как обычная строка (однако изменять его нежелательно). Проиллюстрируем это следующим примером.

Вгпс1пде <все)1о.)1> $1пс1пс)е <вгглпд.н> сваг *р = "Здравствуйте"," зпс ллавп(тоуй ( геяйвсег ьпс /' Выводим строку в прямом и обратном порядке. */ рггпег(р); Еог(е=всг1еп(р)-1) С>-1; Е--) рг1пег["$с", р(Г)); гегцгп О; ) С формальной точки зрения в стандарте языка С++ строковый литерал имеет тип савве сваг *. Однако в языке С++ предусмотрено автоматическое преобразование втип снег ". Таким образом, рассмотренная выше программа является абсолютно правильной.

И все жс эта особенность языка считается нежелательной, поэтому это преобразование не следует применять. Создавая новые программы, строковые литералы нсобходил)о дсиствительно считать константами, а объявление указателя р записывать следующим образом. й сопве сваг *р = "Здравствуйте"; ~~ Указатели на функции Особенно малопонятным, хотя и действенным механизмом языка С++ являются укаяатели на функции (йгпс(юп рогп(сг). Нсслютря на то что функция нс является переменной, >на располагается в памяти, и, следовательно, ее адрес можно присваивать указателю. Этот .ырес считается точкой вхи)а в функцию.

Именно он используется при ее вызове. По;кольку указатель может ссылаться на функцию, се можно вызывать с помощью этого укалзтеля. Это позволяет также передавать функции другим функциям в качестве аргуме)пов. Адрес функции задается се именем, указанным без скобок и аргументов. Чтобы . азобраться в этом механизме, рассмотрим следующую программу. | Ф1пс1пг)е <вело.'и> Л(пс1пс)е <вгг1пд.н> лава 5, указатели чо1г) сйесх(сйах *а, сйах *Ь, Епс ("смр)(сопвс айаг ', попас сйат )) )пс ма(г.(чодо) сйат в1'(80), я2(80); Епс (*р)(сопев сйат *, сопев сйак *); р = вегсмр; пеев (я1); пеев(я2); сйесх(я1, в2, р)г песптп 0; чодг) сйесх(сйаг *а, сйаг *Ь, Епе (*сыр)(сопяс сйах *, сопяе сйаг *)) ( ркдпег("Проверка равенства.хп")г ЕЕ(!(*сыр)(а, Ы ) рзЕпеЕ(йравнк"); е1яе ртдпЕЕ["Не равны"); При вызове Функция ейее)еО получает два указателя иа символьные переменные и указатель на функцию.

Соответствующие аргументы объявлены в се заголовке. Обратите внимание иа то, как объявлен указатель иа функцию. Эту форму объявления следует применять для любых указателей на функции, независимо от того, какой тип имеют их аргументы и возвращаемые значения. Объявление *етр заключено в скобки лля того, чтобы компилятор правильно его интерпретировал. Выражение е) (*сгтр)(а, Ы внутри функции ейее)е() означает вызов функции яехегар[), на которую ссылается указатель етр, с аргументами а и ь. Скобки по-прежнему необхолил(ы. Зто — олин из способов вызвать функцию с помощью указателя.

Альтернативный вызов выглядит так: $ сир(а, Ы; Первый способ применяется чаще, поскольку оп позволяет явно продемонстрировать, что функция вызывается через указатель. (Иначе говоря, читатель программы сразу увидит, что переменная емр является указателем, а ие именем Функции.) Тем ие менее эти два способа эквивалентны. Обратите внимание па то, что функцию сйеск() можно вызвать, непосредственно указав функцию яетегар() в качестве ес аргумента. й сйесх(в1, в2, ягксмр); В агом случае отпадает необходимость в дополнительном указателе иа функцию. Может возникнуть закономерный вопрос: зачем вызывать функции с помощью указателей? На первый взгляд, это лишь усложняет программу, пе предлагая взамен никакой компенсации.

Тем ие менее иногда выгоднее вызывап функции через указатсли и даже создавать массивы указателей ца функции. рассмотрим в качестве примера синтаксический анализатор — сосзавиую часть компилятора, вычисляющую выражения. Оп часто вызывает различные математические функции [синус, косинус,, тап- Часть ). Основы языка С++: подмножество С гене и т.д.), средства ввода-вывода или функции доступа к ресурсам системы. Вместо создания большого оператора ви1есЬ, в котором пришлось бы перечислять все эти функции, можно создать массив указателей на них. В этом случае к функциям можно было бы обращаться по индексу. Чтобы оценить эффективность такого подхода, рассмотрим расширенную версию предыдущей программы.

В этом примере функция сиес)е() проверяет на равенство строки, состоящие из букв или цифр. Для этого она просто вызывает разные функции, выполняющие сравнение. Вап<1ийе <вгйво.Ь> $1пс1нйе <стуре.Ь> 61пс1ийе <всй)1Ь.Ь> Вьпс1нйе <всгапП.Ь> ноьй снеси(онат *а, сиат Ь, 1пе (*сыр)(сосне спат *, сопве спат *)): 1пе ппесгер(сосне спат "а, сопве сиат *Ы; апе ваап(еоьй) ( спат в1(80), в2 (80) ) пеев(в1) деев(в2] 11(1ва1риа(*в1)) снеси(в1, в2, вттспр); е1ве снеси(в1, в2, пнвсвр); хеентп 0; ноай сиест(снах *а, онат *Ь, 1пе (*егер)(сопве сиат *, сопят онат *)) рхйпст'("Проверка равенства.

Характеристики

Тип файла
DJVU-файл
Размер
7,03 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6510
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее