|
Программирование >> Элементы языков с и с++
Прежде чем использовать указатель, его необходимо инициализировать, т.е настроить на какой-то конкретный объект. Указатель может иметь нулевое значение, гарантирующее, что он не совпадает ни с одним значением указателя, используемого в данный момент в программе. Если мы присвоим указателю константу нуль, то получим указатель с нулевым значением. Такой указатель можно сравнивать с мнемоническим null, определенным в стандартной библиотеке stdio.h. Указатель может иметь тип void, т. е. указывать на ничто , но указатель это-1 го типа нельзя путать с нулевым. Объявление: . void *ptr; сообщает о том, что ptr не указывает на конкретный тип данных, а является i универсальным указателем, способным настраиваться на любой тип значе-1 НИИ, включая и нулевой. Примером указателя типа void может служить функция maiioco, возвра-] щающая указатель на динамическую область памяти, выделяемую ею под объект. Она возвращает указатель типа void, и пользователь должен сделать , приведение (casting) этого типа к типу объекта методом принудительного] назначения типа (в скобках указать тип). Если, например, мы выделяли память под объект типа char, то надо объяв-1 л ять: char object[]; char *P={char *)inalloc(sizeof(object)) ; Пусть некоторый указатель Pc указывает на переменную типа char, т. е. со- держит адрес места памяти, начиная с которого располагается объект типа] char (например, строка символов). Объявление такого указателя по определению будет выглядеть так: char Рс; Здесь имя указателя - Рс, а не *Рс. Несмотря на такое объявление, сам указатель- это переменная Рс. Теперь 1 воздействуем на него операцией разыменования. Получим *Рс. Это будет! значение первого символа строки, на начало которой указывал указатель.! Чтобы получить значение следующего символа строки, надо указатель yse-J личить на единицу: Рс++ и применить * (Рс++). Вообще, какого бы типа ни был объект, на начало которого в памяти указы-] вает некоторый указатель ? (а он указывает именно на начало объекта в na-J мяти, когда говорят, что он указывает на объект), р++ всегда указывает на! следующий элемент объекта, p+i - на i-й элемент. Приращение адреса, который содержит указатель р, всегда сопровождается масштабированием размера памяти, занимаемого элементом объекта. Мы только что разобрали понятие указателя в общем смысле. Однако в VC-H- это понятие несколько расширено, что вполне естественно для развивающихся систем. Здесь рассматриваются указатели трех типов: П регулируемые указатели; П нерегулируемые указатели; П нерегулируемые указатели функций. Чтобы понять суть сказанного, вспомним, что во введении к данной книге упоминалась среда CLR- это менеджер, который управляет исполнением кода, памятью, потоками и работой с удаленными компьютерами, при этом строго обеспечивая безопасность и создавая надежность исполнения кода. CLR является добавкой-расширением С++, введенной фирмой Microsoft, начиная с версии VC++ 2005. Подключение к вашему проекту этого менеджера осуществляется на этапе компиляции. Если вы посмотрите свойства вашего проекта с помощью опции ProjectProperties и в открывшемся диалоговом окне выберете папку Configuration Properties/General, то в правой части окна увидите настраиваемое свойство Common Language Runtime support (поддержка режима CLR). Для консольного приложения (по умолчанию) этот режим не поддерживается (т. е. консольное приложение как бы остается в старой версии С++, в родной (native), как определили ее авторы добавки CLR). В этой старой версии, когда вы в своей программе работаете с некоторыми объектами (здесь нам приходится забегать вперед, ибо объекты - это предмет более позднего изучения, когда мы станем знакомиться с классами), то должны сами заботиться об их размещении в памяти, выделяемой средой. Память для вашего приложения выделяется в так называемой куче : в ней вы размещаете свои объекты, там же сами освобождаете память, когда перестаете работать с объектом, иначе куча может переполниться и процесс выполнения приложения прервется. Это так называемая неуправляемая куча. Указатели на участки памяти в такой куче обозначаются символом * . Вот два последних типа указателя и являются традиционными указателями C/C++ на объекты в нерегулируемом объеме памяти, выделяемой для исполнения приложения. Другое дело, когда включается режим CLR. Ранее мы уже видели, что можно создавать консольные приложения в этом режиме. Такое приложение отли- ..Листинг 7.1 Я1 ........ ............:............ ...... Шл II 44.СРР : main project file. ttinclude stdafx.h ref struct Message { System: : String sender, receiver, data; чается от обычного тем, что его заготовка обеспечивает подключение к приложению специального системного пространства System, содержащего объекты, размещение в памяти которых надо автоматически регулировать. Так вот: режим CLR работает уже с управляемой кучей памяти, в которой размещение объектов и ее освобождение от них происходит под управлением среды. Такой сервис входит в язык Java, где не надо делить кучу на управляемую и неуправляемую. Регулируемый указатель - это тип указателя, который ссылается на объекты (адреса памяти, по которым можно обращаться к объектам), расположенные в общей регулируемой куче памяти, предоставленной приложению в момент его исполнения. Для таких указателей принято специальное обозначение: вместо символа * применяется символ Создание CLR привело к необходимости разработки аппарата преобразования переменных, относящихся к одной куче, в адреса в другой и т. п. Этот процесс назвали маршаллизацией. Существует специальная библиотека, обеспечивающая этот процесс. Таблица некоторых преобразований приведена в приложении 4. Однако все это довольно усложнило программирование. Разработчики Java, видимо, учли эти неприятности, потому что там создана сразу своя CLR. При рассмотрении работы с компонентами так называемых форм (см. главы 10-12) вы увидите, что регулируемые указатели создаются в обработчиках событий компонентов и что свойства проектов, работающих с объектами, содержат автоматическое подключение при компиляции поддержки режима CLR. В среде VC++ существует специальная утилита gcnew, которая формирует экземпляр какого-то объекта, выделяя ему (экземпляру) некоторую память, и возвращает ссылку на этот экземпляр. В листинге 7.1 приводится j пример программы, результат работы которой представлен на рис. 7.1. Пример надо рассматривать просто как демонстрацию работы с объектом Структура , суть которой мы рассмотрим позже.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |