Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Часть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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.026 с.)
Главная | Случайная страница | Обратная связь