Пример использования массивов строк



 

Массивы строк обычно используются для обработки таблиц данных. Рассмотрим, например, упрощенную базу данных служащих, в которой хранится имя, номер телефона, количество часов, отработанных служащим за отчетный период, и размер почасового оклада для каждого служащего. Чтобы создать такую программу для коллектива, состоящего из десяти служащих, определим четыре массива (из них первые два будут массивами строк).

 

 

Чтобы ввести информацию о каждом служащем, воспользуемся следующей функцией enter() .

 

 

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

 

 

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

 

Глава 6: Указатели

 

Указатели, без сомнения, – один из самых важных и сложных аспектов C++. В значительной степени мощь многих средств C++ определяется использованием указателей. Например, благодаря им обеспечивается поддержка связных списков и динамического выделения памяти, и именно они позволяют функциям изменять содержимое своих аргументов. Однако об этом мы поговорим в последующих главах, а пока (т.е. в этой главе) мы рассмотрим основы применения указателей и покажем, как можно избежать некоторых потенциальных проблем, связанных с их использованием.

При рассмотрении темы указателей нам придется использовать такие понятия, как размер базовых С++‑типов данных. В этой главе мы предположим, что символы занимают в памяти один байт, целочисленные значения – четыре, значения с плавающей точкой типа float – четыре, а значения с плавающей точкой типа double – восемь (эти размеры характерны для типичной 32‑разрядной среды).

 

Что представляют собой указатели

 

Указатели – это переменные, которые хранят адреса памяти. Чаще всего эти адреса обозначают местоположение в памяти других переменных. Например, если х содержит адрес переменной у , то о переменной, х говорят, что она "указывает" на у .

Указательэто переменная, которая содержит адрес другой переменной.

Переменные‑указатели (или переменные типа указатель ) должны быть соответственно объявлены. Формат объявления переменной‑указателя таков:

 

 

Здесь элемент тип означает базовый тип указателя, причем он должен быть допустимым С++‑типом. Элемент имя_переменной представляет собой имя переменной‑указателя. Рассмотрим пример. Чтобы объявить переменную р указателем на int ‑значение, используйте следующую инструкцию.

 

 

Для объявления указателя на float ‑значение используйте такую инструкцию.

 

 

В общем случае использование символа "звездочка" (* ) перед именем переменной в инструкции объявления превращает эту переменную в указатель.

Базовый тип указателя определяет тип данных, на которые он будет ссылаться.

Тип данных, на которые будет ссылаться указатель, определяется его базовым типом. Рассмотрим еще один пример.

 

 

Как отмечено в комментариях, переменная ip – это указатель на int‑значение, поскольку его базовым типом является тип int, а переменная dp – указатель на double‑значение, поскольку его базовым типом является тип double, Следовательно, в предыдущих примерах переменную ip можно использовать для указания на int‑значения, а переменную dp на double‑значения. Однако помните: не существует реального средства, которое могло бы помешать указателю ссылаться на "бог‑знает‑что" . Вот потому‑то указатели потенциально опасны.

 

Операторы, используемые с указателями

 

С указателями используются два оператора: "*" и "&" Оператор "&" – унарный. Он возвращает адрес памяти, по которому расположен его операнд. (Вспомните: унарному оператору требуется только один операнд.) Например, при выполнении следующего фрагмента кода

 

 

в переменную balptr помещается адрес переменной balance . Этот адрес соответствует области во внутренней памяти компьютера, которая принадлежит переменной balance . Выполнение этой инструкции никак не повлияло на значение переменной balance . Назначение оператора можно "перевести" на русский язык как "адрес переменной ", перед которой он стоит. Следовательно, приведенную выше инструкцию присваивания можно выразить так: "переменная balptr получает адрес переменной balance" . Чтобы лучше понять суть этого присваивания, предположим, что переменная balance расположена в области памяти с адресом 100 . Следовательно, после выполнения этой инструкции переменная balptr получит значение 100 .

Второй оператор работы с указателями (* ) служит дополнением к первому (& ). Это также унарный оператор, но он обращается к значению переменной, расположенной по адресу, заданному его операндом. Другими словами, он ссылается на значение переменной, адресуемой заданным указателем. Если (продолжая работу с предыдущей инструкцией присваивания) переменная balptr содержит адрес переменной balance , то при выполнении инструкции

 

 

переменной value будет присвоено значение переменной balance , на которую указывает переменная balptr . Например, если переменная balance содержит значение 3200 , после выполнения последней инструкции переменная value будет содержать значение 3200 , поскольку это как раз то значение, которое хранится по адресу 100 . Назначение оператора "*" можно выразить словосочетаинем "по адресу" . В данном случае предыдущую инструкцию можно прочитать так: "переменная value получает значение (расположенное) по адресу balptr" . Действие приведенных выше двух инструкций схематично показано на рис. 6.1.

Последовательность операций, отображенных на рис. 6.1, реализуется в следующей программе.

 

 

 

 

При выполнении этой программы получаем такие результаты:

 

 

К сожалению, знак умножения (* ) и оператор со значением "по адресу" обозначаются одинаковыми символами "звездочка" , что иногда сбивает с толку новичков в языке C++. Эти операции никак не связаны одна с другой. Имейте в виду, что операторы "*" и "&" имеют более высокий приоритет, чем любой из арифметических операторов, за исключением унарного минуса, приоритет которого такой же, как у операторов, применяемых для работы с указателями.

Операции, выполняемые с помощью указателей, часто называют операциями непрямого доступа, поскольку мы косвенно получаем доступ к переменной посредством некоторой другой переменной.

Операция непрямого доступаэто процесс использования указателя для доступа к некоторому объекту.

 


Дата добавления: 2018-09-22; просмотров: 270; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!