ВУЗ:
Аналогично этому, после определения пользовательского типа EmployeeType, с помощью следующего оператора
можно объявить, что переменные DistManager, SalesRepl и SalesRep2 относятся к данному типу:
EmployeeType DistManager, SalesRepl, SalesRep2;
Важно отличать определенные пользователем типы данных и сами элементы данных этих типов. Последние рассматри-
ваются как реализации (instance) данного типа. Тип, определенный пользователем, по сути, является шаблоном, используе-
мым при создании экземпляров данных этого типа. Он описывает свойства, которые имеют все реализации данного типа, но
сам не является реальным представителем этого типа. В предыдущем примере тип пользователя EmployeeType использо-
вался для создания трех реализаций этого типа: DistManager, SalesRepl и SalesRep2.
Указатели. Вспомните, что ячейки в оперативной памяти машины идентифицируются числовыми адресами. Эти чи-
словые значения можно также хранить в ячейках памяти. Указатель (pointer) – это ячейка (или блок ячеек) памяти, содер-
жащая адрес другой ячейки памяти. Применительно к структурам данных, указатели используются для записи адресов эле-
ментов данных. Таким образом, элемент данных может храниться в какой-либо ячейке памяти, а адрес этой ячейки – в указа-
теле, при помощи которого можно позже получить эти данные. То есть значение указателя сообщит нам, где искать данные. В
некотором смысле указатель указывает на данные, отчего и получил такое название.
Мы уже встречались с концепцией указателей в контексте счетчика команд процессора, который содержит адрес оче-
редной инструкции для выполнения. Фактически, другое название счетчика команд – указатель команд (instruction pointer).
Адреса, также называемые URL, которые используются для связи гипертекстовых документов, также могут служить приме-
ром концепции указателей, но они указывают местоположения в сети Интернет, а не в оперативной памяти компьютера.
Во многих современных языках программирования указатели включены в набор основных типов данных. Можно объ-
являть, выделять память и манипулировать указателями так же, как целыми числами или строками. При помощи такого язы-
ка программист может создавать развитые сети элементов данных в памяти машины, где каждый блок ячеек памяти содер-
жит указатели на другие блоки. Следуя указателям, можно проследить эти пути от блока к блоку.
В качестве примера давайте представим, что в компьютерной памяти хранится список рассказов, отсортированный в
алфавитном порядке по названию. Такая организация удобна во многих приложениях, но одновременно затрудняет поиск
всех рассказов, написанных одним автором, так как они беспорядочно разбросаны по списку. Для решения этой проблемы
можно зарезервировать в каждом блоке ячеек памяти, представляющем один рассказ, отдельную ячейку типа указатель. То-
гда в каждом из этих указателей можно хранить адрес другого блока, представляющего произведение того же автора, и все
рассказы одного автора будут связаны в замкнутую цепь. Отыскав один рассказ заданного автора, мы можем найти и все
остальные, переходя по указателям от книги к книге.
Проблема указателей. Известно, что использование блок-схем может привести к путанице при разработке алгоритмов (см. главу
4), а беспорядочное использование команд безусловного перехода goto ведет к созданию плохо спроектированных программ (см.
главу 5). Точно так же бессистемное использование указателей, как оказалось, может привести к созданию необоснованно сложных и
потенциально приводящих к ошибкам структур данных. Чтобы внести некоторый порядок в этот хаос, многие языки программиро-
вания ограничивают допустимую гибкость использования указателей. Например, в языке Java не разрешается использовать указатели
общего вида. Допускается применение только ограниченных типов указателей – так называемых ссылок. Одно из отличий между
ссылками и указателями состоит в том, что значение ссылки нельзя модифицировать с помощью арифметических операций. Напри-
мер, если программист, работающий на языке Java, хочет переместить ссылку Next к следующему элементу массива, он должен ис-
пользовать инструкцию, эквивалентную следующему выражению:
переадресовать ссылку Next к следующему элементу массива
Тогда как программист, работающий на языке С, может использовать инструкцию, эквивалентную следующей:
присвоить ссылке Next значение Next + 1
Заметим, что инструкция на языке Java лучше отражает назначение производимого действия. Более того, для выполнения инструк-
ции языка Java необходимо, чтобы существовал еще один элемент массива. Однако если ссылка Next уже указывает на последний элемент
массива, то выполнение инструкции языка С приведет к тому, что она будет указывать на нечто, находящееся вне массива, – распростра-
ненная ошибка начинающих (и не только начинающих) программистов.
Операторы присваивания. Наиболее важным выполняемым оператором является оператор присваивания (assignment
statement), предназначенный для присвоения переменной некоторого значения. Синтаксически форма этого оператора обыч-
но состоит из имени переменной, символа операции присваивания и выражения, определяющего то значение, которое долж-
но быть присвоено переменной. Семантика этого оператора заключается в вычислении выражения, стоящего в его правой
части, и присвоении полученного результата переменной, указанной в левой части оператора. Например, в языках С, C++ и
Java в результате выполнения приведенного ниже оператора, переменной Total присваивается сумма значений переменных
Price и Tax:
Total = Price + Tax;
В языках Ada и Pascal эквивалентный оператор записывается в следующем виде:
Total := Price + Tax;
Обратите внимание, что эти операторы отличаются только синтаксисом операции присваивания, которая в языках С,
C++ и Java обозначается просто знаком равенства, а в языках Ada и Pascal перед знаком равенства ставится двоеточие. Воз-
можно, более удачное обозначение операции присваивания используется в языке APL (А Programming Language – язык про-
граммирования), разработанном Кеннетом Иверсеном (Kenneth E. Iverson) в 1962 году. В этом языке для представления опе-
рации присваивания используется стрелка. Таким образом, предыдущий оператор присваивания в языке APL (как и в нашем
псевдокоде) будет записан следующим образом:
Total <— Price + Tax
Страницы
- « первая
- ‹ предыдущая
- …
- 116
- 117
- 118
- 119
- 120
- …
- следующая ›
- последняя »