Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
ЧастьII.Становимсяпрограмми
Обработка символов типа В на каждую переменную стандартного типа char выделяется 8-битовое поле, в котором можно представить 256 значений (от 0 до 255). Это 10 цифр, 26 строчных и 26 прописных букв. При этом остается более чем достаточно места для включения символов кириллицы. Проблемы с этим типом возникают, когда необходимо включить в текст восточные алфавиты, особенно китайские и японские иероглифы. А в них символов, без преуве- личения, тысячи, т.е. намного больше, чем можно представить в обычном 8-битовом множестве символов. В C++ включена поддержка новейшего символьного типа wchar_t, или расши- ренного char. Хотя он не настолько в язык, как тип char, многие функции C++ позволяют работать с ним. Например, wstrstr( ) умеет сравнить два символь- ных множества типа wchar_t. Если вы будете разрабатывать интернациональные при- ложения и захотите использовать восточные языки, вам понадобятся функции, кото- рые работают с этим расширенным символьным типом. Но, так как этот вопрос на- много сложнее, его подробное обсуждение выходит за рамки данной книги.
C++ предоставляет набор низкоуровневых функций ввода и вывода. Наиболее час- то используется функция которая осуществляет вывод форматированной строки на устройство стандартного вывода. В простейшем варианте функции переда- ется единственный аргумент — выводимая строка: для вывода на дисплей"); print f может осуществлять управляемый вывод с помощью внедряемых в строку команд управления форматом, начинающихся со знака Например, следую- щий фрагмент выводит строку со значениями целой и действительной переменных: = 1; double doubleVar = 3.5; значение равно " значение равно doubleVar); Целое значение будет вставлено на месте а действительное — на месте и выводимая строка будет выглядеть следующим образом: Целое значение равно значение равно 3.5 Тем не менее в книге используется более простой и менее подверженный ошибкам со стороны программиста способ вывода с помощью потоков.
Глава 7. Хранение последовательностей в массивах 87 Глава 8 Первоезнакомствос указателями в C++ Что такое адрес Использовани е указателей Передача указателей функция м Использовани е кучи
о сравнению с другими языками C++ достаточно консервативен, он обладает собственным уникальным синтаксисом, благодаря которому программы, рабо- тающие с большим количеством переменных, можно реализовать гораздо компактнее с помощью указателей. Указатель — это переменная, которая содержит адрес другой переменной (т.е. ее расположение в памяти). В этой главе представлены основы работы с указателями. Сначала рассматривают- ся концепции, с которыми необходимо обязательно ознакомиться для работы с указа- телями, затем поясняется синтаксис указателей и некоторые причины их высокой по- пулярности в C++.
Очевидно, что каждая переменная C++ расположена где-то в памяти компьютера. Память разбита на байты, каждый из которых имеет свой адрес — 0, 1, 2 и т.д. Переменная intRandy может находиться ПО адресу 0x100, floatReade r по адресу 0x180 (адреса в памяти принято записывать в виде). Подобно людям, всякая переменная занимает некоторое место, более того по срав- нению с другой переменной ей может понадобиться больше или меньше места (не бу- дем вдаваться в подробности о том, кто и сколько места занимает). Количество памяти, выделяемое для переменных разных типов, приведено в табл. 8.1 (размер переменных приведен для процессора Pentium и компиляторов GNU C++ и Visual C++). Таблица Названия типов и их размеры в памяти Тип ПЕРЕМЕННОЙ РАЗМЕР В ПАМЯТИ (В БАЙТАХ) 4 long 4 float 4 double 8
В соответствии с этой написана тестовая программа, наглядно демонстри- рующая расположение переменных в памяти (не обращайте внимания на неизвестный оператор & — будем пока просто считать, что он возвращает адрес переменной в памяти). // Layout — эта программа призвана дать // читателю представление о
88 Часть //. Становимся программистами // расположении переменных в памяти
int intArgc, char* pszArgs[]) { int int n; long 1; float f; d;
// ЕЫВО Д в виде (ios: ;
// выводить адреса переменных // очереди, чтобы показать размер // каждой переменной << = Ox" << << = Ox" << <• << = Ox" << << Ox" << (long) << = Ox" << <•
"\n "\n "\n "\n << return 0 = Ox" << с волнуйтесь, если программа будет возвращать разные значения при каж- дом запуске. Просто каждый раз программа хранит переменные по разным адресам. Важна только связь между адресами переменных.
Сравнив расположение переменных, можно заключить, что п занимает четыре байта, 1 также занимает четыре и т.д. (в соответствии с приведенной таблицей). GNU C++, и Visual C++ выделяют одинаковое количество памяти под переменные одного типа.
использование Переменная-указатель содержит адрес, обычно это адрес другой переменной. В табл. 8.2 приведены основные операторы для работы с указателями. Таблица8.2.Операторыдляработысуказателями ОПЕРАТОР НАЗНАЧЕНИЕ & Получить адрес переменной * (унарный) Операция разыменования — возвращает переменную, на которую указы- вает указатель (в выражении). Указатель на данный тип (в объявлении) Пример работы с операторами приведен в следующем листинге: Глава 8. Первое знакомство с указателями в C++ 89 void in" ; pintVar;
- // указывает на = // Б переменой } // по адресу, находящемуся в Функция f n () начинается с объявления переменной intVar; в следующей строке объявляется pir.tVar — указатель переменную типа int . объявляются как обычные но в объявление добавляется унарный оператор *, который может быть использован совместно с именем любого типа. В данной строке этот символ используется вместе с фундаментального типа int . Однако этот оператор использоваться для добавления к любому име- ни переменной типа. При написании программ желательно придерживаться соглашений об именах, в соответствии с которыми первый символ в названии переменной указывает на ее тип. Например, можно использовать для int , d для double и т.д. С учетом этого соглашения имена указателей далее в книге будут начинаться с буквы р. Унарный оператор & в выражении означает "взять адрес переменной". Таким об- в первой строке приведенного кода находится команда сохранения адреса пе- ременной в переменной pintVar. Представим себе, что функция fn <} начинается с адреса 0x100, переменная расположена по адресу 0x102, а указатель pintVar — 0x106 (такое расположе- ние намного проще результатов работы программы Layout; на самом деле вряд ли переменные будут храниться в памяти именно в таком порядке). Первая команда программы сохраняет значение в указателе pintVar. Вторая строка отвечает за присвоение значения 10 переменной, хранящейся но адресу, который содержится в указателе pintVar (в нем находится число 0x102, т.е. адрес переменной intVar).
Сравнение указателей и почтовых адресов Указатели похожи на адреса домов. Ваш дом имеет уникальный адрес, и каждый байт в памяти компьютера тоже имеет уникальный адрес. Почтовый адрес содержит набор цифр и букв. Например, он может выглядеть так: 123 Main Street (конечно же, это не мой адрес! Я не люблю нашествий поклонников, если только они не женского пола). Адрес переменной в памяти содержит только цифры (например, 123456). Можно хранить диван в доме по адресу 123 Main Street, и точно так же можно хранить число в памяти по адресу 0x123456. Можно взять лист бумаги и написать на нем адрес — 123 Main Street. Теперь диван хранится в доме, который находится по адресу, написанному на листке бумаги. Так работают сотрудники службы доставки: они доставляют диваны по адресу, который указан в бланке заказа, независимо от того, какой именно адрес записан в бланке (я ни в коем случае не смеюсь над работ- никами службы доставки — просто это самый удобный способ объяснить указатели). Использовав синтаксис это можно записать так: House House" = = couch; Эта запись обозначает следующее: является домом, a houseAddress — адресом дома. Надо записать адрес дома myHouse в указатель houseAddress и доста- вить диван по адресу, который находится в указателе houseAddress.
|
Последнее изменение этой страницы: 2019-04-19; Просмотров: 243; Нарушение авторского права страницы