Вход/Регистрация
Программирование на Objective-C 2.0
вернуться

Кочан Стивен

Шрифт:

присваивает указателю intPtr адрес в памяти компьютера, который был выделен для переменной count. Так, если count размешена по адресу 1000FF6, этот опера-тор присвоит указателю intPtr значение OxlOOOFF.

Применение оператора косвенного доступа * к переменной-указателю, как в выражении *intPtr

означает интерпретацию значения, содержащегося в этой переменной, как адреса памяти. Значение, хранящееся по этому адресу, считывается и интерпретируется в соответствии с типом, объявленным для этой переменной. Например, если переменная intPtr является указателем на тип int, то система будет интерпретировать значение, хранящееся по адресу памяти, заданному с помощью *intPtr, как целое значение. 13.5. Объединения

Одной из наиболее необычных конструкций в языке программирования Objective-C является объединение (union). Эта конструкция используется в ос-новном для сложных программных приложений, когда требуется сохранять раз-личные типы данных в одном и том же месте памяти. Предположим, что нужно определить одну переменную с именем х, которую можно было бы использовать для хранения одного символа, числа с плавающей точкой или целого числа. Для этого можно определить объединение, например, с именем mixed. union mixed { char с; float f; int i; };

Объявление объединения совпадает со структурой (за исключением ключевого слова union). Принципиальным отличием между структурами и объединениями является способ выделения памяти. Объявление переменной типа union mixed, как в union mixed х;

не означает, что х содержит три отдельных компонента с именами с, f или i. На самом деле х содержит один компонент, который называется с, f или L Тем самым мы можем использовать переменную х для хранения элемента типа char, float или int, но не всех трех типов одновременно. Чтобы сохранить какой-либо символ в переменной х, используется оператор х.с = 'К';

Чтобы сохранить в х значение с плавающей точкой, используется форма за-писи x.f: x.f = 786.3869;

И, наконец, чтобы сохранить в х результат деления целой переменной count на 2, используется оператор x.i = count / 2;

Поскольку элементы х типа float, char и int находятся в одном месте памяти, мы можем единовременно сохранять в х только одно из этих значений. Кроме того, значение, которое считывается из объединения, должно соответствовать тому, что было в последний раз записано в это объединение.

При определении объединения имя объединения указывать не обязательно, и переменные можно объявлять одновременно с определением этого объединения. В объединениях можно объявлять указатели с таким же синтаксисом и правилами выполнения операций, как для структур. Мы можем инициализировать переменную типа union следующим образом. union mixed х = {'#'};

Первому члену х, то есть с, присваивается символ #. Определенный член объединения можно также инициализировать по имени следующим образом. union mixed х = {.f= 123.4;};

Мы можем инициализировать автоматическую union-переменную типа присвоив ей другую union-переменную того же типа.

С помощью объединения можно определять массивы для хранения элементов данных различного типа. Ниже задается массиве именем table, содержащий kTableEntries элементов. struct { char *name; int type; union { int i; float f; char c; } data; } table [kTableEntries];

Каждый элемент этого массива содержит структуру, включающую указатель на типа char с именем паше, целый компонент с именем type и union-компонент с именем data. Каждый элемент data может содержать компонент типа int, float или char. Целый компонент type позволяет следить за типом значения, сохраняемого в data. Мы можем присвоить type значение INTEGER (определенное соответствую-щим образом), если содержится значение типа int; значение FLOATING, если со-держится значение типа float; CHARACTER, если содержится значение типа char. Эта информация позволяет узнать, как обращаться к определенному компоненту структуры data определенного элемента массива.

Чтобы сохранить символ '#' в элементе table[5] и затем записать в поле type, что в этом месте хранится символ, применяются два оператора table[5].data.c = '#'; table[5].type = CHARACTER;

Во время перебора элементов table можно определять тип значения данных, хранящегося в каждом элементе, с помощью набора проверок. Например, в следующем цикле выводится имя и его значение из массива table. enum symbolType {INTEGER, FLOATING, CHARACTER }; ... for (j = 0; j < kTableEntries; ++j) { NSLog (@"%s", table[j].name); switch (table [j], type ) { case INTEGER: NSLog (@"%i", tableOl-data.i); break; case FLOATING: NSLog (@"%g", table[j].data.f); break; case CHARACTER: NSLog (@"%cn, table[j].data.c); break; default: NSLog (@"Unknown type (%i), element %i", table(j]-type, j); break; } }

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

Теперь вы знаете, как определять массивы, структуры, символьные строки и объединения и как работать с ними в программах. Помните главное: они не яв-ляются объектами. Мы не можем передавать им сообщения. Они не позволяют полностью использовать такие удобные возможности, как стратегию выделения памяти, которая обеспечивается в Foundation framework. Это одна из причин, по которым я советовал пропустить эту главу и вернуться к ней позже. Вы лучше подготовлены к изучению того, как использовать классы Foundation, в которых массивы и строки определяются как объекты, чем к использованию таких средств, встроенных в язык. Прибегайте к использованию типов, описанных в этой главе, только в случае реальной необходимости! 13.7. Различные средства языка

  • Читать дальше
  • 1
  • ...
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: