355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Стивен Кочан » Программирование на Objective-C 2.0 » Текст книги (страница 28)
Программирование на Objective-C 2.0
  • Текст добавлен: 19 сентября 2016, 13:02

Текст книги "Программирование на Objective-C 2.0"


Автор книги: Стивен Кочан



сообщить о нарушении

Текущая страница: 28 (всего у книги 32 страниц)

Сборка мусора (garbage collection). Система управления памятью, которая авто-матически освобождает память, занятую объектами, ссылки на которые отсут-ствуют. Сборка мусора не поддерживается в среде runtime iPhone.

Секция implementation (implementation section). Секция определения класса, ко-торая содержит конкретный код (то есть реализацию) для методов, объявленных в соответствующей секции interface (или в соответствии с определением протокола).

Секция interface (interface section). Секция для объявления класса, его супер-класса, переменных экземпляра и методов. Для каждого метода объявляются также типы аргументов и тип возвращаемого значения. См. также Секция implementation.

Секция интерфейса. См. Секция interface.

Секция реализации. См. Секция implementation.

Селектор (selector). Имя, используемое для выбора метода, который должен быть выполнен для объекта. Компилированные селекторы имеют тип SEL, и они могут генерироваться с помощью директивы @selector.

Символьная строка (character string). Последовательность символов, которая заканчивается нуль-символом (“").

Синтезируемый метод (synthesized method). Метод-установщик (setter) или ме-тод-получатель (getter), который автоматически создается для вас компилято-ром. Эта возможность была добавлена в язык Objective-C 2.0.

Словарь (dictionary). Коллекция пар ключ-значение, реализуемая в Foundation с помощью классов NSDictionary и NSMutableDictionary.

Си. также Метод-установщик

Сообщение (message). Метод и связанные с ним аргументы, которые передаются объекту (получателю сообщения).

Составной класс (composite class). Класс, который состоит из объектов других классов; он часто используется как альтернатива подклассов.

Список свойств (property list). Представление различных типов объектов в стан-дартизованном формате. Списки свойств обычно хранятся в формате XML.

Статическая переменная (static variable). Переменная, область действия которой ограничена блоком или модулем, в котором она определена. Статические пе-ременные имеют начальное значение по умолчанию, равное 0, и сохраняют с вое значение после вызова метода или функции.

Статическая функция (static function) . Функция, объявляемая с ключевым сло-вом static. Ее могут вызывать только другие функции или методы, определенные в том же исходном файле.

Статический контроль типов (static typing) . Явное указание класса, которому принадлежит объект, на этапе компиляции. См. также Динамический контроль типов.

Структура (structure) . Составной тип данных, который может содержать эле-менты различных типов. Структуры можно присваивать другим структурам, передавать как аргументы функциям и методам, и они могут также возвращаться функциями и методами.

Суперкласс (super class). Родительский класс определенного класса. См. также super.

Счетчик ссылок (reference count). См. Счетчик удержаний.

Счетчик удержаний (retain count). Счетчик числа ссылок на объект. Наращива-ется путем передачи объекту сообщения retain и уменьшается путем передачи сообщения release.

Уведомление (notification). Процесс передачи сообщения объектам, которые зарегистрированы для извещения (уведомления) в случае возникновения опре-деленного события.

Указатель (pointer). Значение, которое является ссылкой на другой объект или тип данных. Указатель реализуется как адрес определенного объекта или зна-чения п памяти. Экземпляр класса – это указатель на местонахождение данных объекта в памяти.

Формальный протокол (formal protocol). Набор связанных методов, которые сгруппированы под именем, объявленным с помощью директивы ©protocol. Различные классы (не обязательно связанные) могут принять формальный протокол путем реализации (или наследования) всех его обязательных методов. См. также Неформальный протокол

Фреймворк (framework). Набор классов, функций, протоколов, документации, header-файлов и других ресурсов, которые связаны друг с другом. Например, фреймворк Cocoa используется в разработке интерактивных графических при-ложений под управлением Mac OS X.

Функция (function). Блок операторов, идентифицируемый определенным име-нем; может принимать один или несколько аргументов, передаваемых в виде значений, и может (не обязательно) возвращать значение. Функции могут быть локальными (статическими) по отношению к файлу, в котором они определе– иы, или глобальными. Во втором случае их можно вызывать из функций или методов, определенных в других файлах.

Экземпляр (instance). Конкретное представление класса. Экземпляры – это объекты, которые обычно создаются путем передачи объекту-классу сообщения altoc или new.

Этап выполнения (runtime). Время, когда выполняется программа; runtime – это также механизм, ответственный за выполнение инструкций программы.

Этап компиляции (compile time). Этап, во время которого происходит анализ исходного кода и ею преобразование в формат более низкого уровня, который называется объектным кодом.

Приложение В. Сводка языка Objective-C

В этом приложении содержится краткий справочник по языку Objective-C в удобном формате. Эта не полный справочник, а скорее неформальное описание средств языка. Тщательно проработайте этот материал после того, как закончите работу с основным текстом книги. Это позволит вам не только закрепить изученный материал, но и лучше понять возможности Objective-C.

Описание основывается на стандарте ANSI С99 (ISO/IEC 9899:1999) с рас-ширениями языка Objective-C. На момент написания этой книги в моей системе Mac OS X vl0.5.5 последняя версия компилятора GNU gcc имела номер 4.0.1. Диграфы и идентификаторы Символы-диграфы

Следующие двухсимвольные последовательности (диграфы) эквивалентны указанным односимвольным пунктуаторам. Диграф Значение <: [ :> ] <% { %> } %: # %:%: ## Идентификаторы

Идентификатор в Objectivc-C состоит из последовательности букв (прописных и строчных), имен универсальных символов (см. ниже), цифр и знака подчеркивания. Первый символ идентификатора должен быть буквой, знаком подчеркивания или именем универсального символа. Первые 31 символов идентификатора обязательно будут значащими для внешнего имени, первые 63 символа обязательно будут значащими для внутреннею имени или имени макроса. Имена универсальных символов

Имя универсального символа состоит из символов и, мосле которых следуют четыре шестнадцатеричных числа, или из символов U, после которых следуют восемь шестнадцатеричных чисел. Если первый символ идентификатора указан универсальным символом, его значение не может быть символом цифры. Универсальные символы при использовании в именах идентификаторов не могут указывать символ, значение которого меньше А0,6 (в отличие от 241б,401б или 60|6), или символ в диапазоне от D800l6 до DFFF|6 включительно.

Имена универсальных символов можно использовать в именах идентификаторов, символьных константах и символьных строках. Ключевые слова

Приведенные ниже идентификаторы являются ключевыми словами, представляющими специальное значение для компилятора Objective-C.

_Bool

_Complex

Jmaginary

auto

break

bycopy

byret

case

char

const

continue

default

do

double

else

enum

extern

float

for

goto

if

in

inline

inout

int

long

oneway

out register

restrict

return

self

short

signed

sizeof

static

struct

super

switch

typedef

union

unsigned

void

volatile

while Директивы

Директивы компилятора начинаются со знака @ и используются особым образом для работы с классами и обработками, см. таблицу В. I.

Табл. В.1. Директивы компилятора Директива Описание Пример @"символы" Определяет константный строковый объект типа NSSTRING. (Дня смежных строк выполняется конкатенация.) NSString *url = @"http://www.kochan-wood.com"; @class с1, с2,... Объявляет c1 , с2 ,... как классы. @class Point, Rectangle; @defs (класс) Возвращает список структурных переменных для класса. struct Fract {@defs( Fraction);} *fractPtr; fractPtr = (struct Fract *) [[Fraction alloc] init]; @dynamic имена Методы доступа для имен могут предоставляться динамически. @dynamic drawRect; @encode (тип) Строковое кодирование для типа. @encode (int *) @end Заканчивает секцию interface, секцию implementation или секцию протокола. @end @implementation Начинает секцию implementation, @implementation Fraction @interface Начинает секцию interface. @interface Fraction: NSObject @private Определяет область действия одной или нескольких переменных экземпляра. См. «Переменные экземпляра» @protected Определяет область действия одной или нескольких переменных экземпляра. @public Определяет область действия одной или нескольких переменных экземпляра. @property (список) имена Объявляет свойства в списке для имен. @property (retain, nonatomic) NSSTHING *name; @protocol Создает объект типа Protocol для указанного протокола. @protocol (Copying)]){...} if ([myObj conformsTo: (protocol) @protocol имя Начинает определение протокола для имени. @protocol Copying @selector (метод) Объект типа SEL для указанного метода. if ([myObj respondsTo: @selector(allocF)]) (...) @synchronized (объект) Начинает блок, который должен выполняться одним потоком. Объект называется взаимоисключающим (mutually exclusive, mutex) семафором. @synthesize имена Генерирует методы доступа для имен, если они не заданы. @synthesize name, email; См. также «Переменные экземпляра» @try Начинает блок для улавливания исключительных ситуаций (исключений). См. «Обработка исключительных ситуаций» @catch (исключение) Начинает блок для обработки исключения. @finally Начинает блок, который выполняется в предположении, что предыдущем блоке @try было «инициировано» (throw) исключение. @throw Инициирует исключение. Предопределенные идентификаторы

В таблице В.2 приводится список идентификаторов, которые имеют специальный смысл в программах на Objective-C.

Табл. В.2. Специальные предопределенные идентификаторы Идентификатор Описание _cmd Локальная переменная, автоматически определяемая в методе, который содержит селектор для этого метода. func Локальная символьная строковая переменная, автоматически определяемая в функции или в методе; содержит имя функции или метода. BOOL Булева переменная, обычно со значениями YES и NO. Class Тип объекта-класса. id Обобщенный тип объекта. IMP Указатель на метод, возвращающий значение типа id. nil Пустой объект. Nil Пустой объект-класс. NO Определяется как (BOOL) 0 NSObject Корневой объект Foundation, определенный в < Foundation/NSObject.h>. Protocol Имя класса для хранения информации о протоколах. SEL Откомпилированный селектор. self Локальная переменная, автоматически определяемая в методе, которая обозначает получателя сообщения. super Родительский объект получателя сообщения. YES Определяется как (BOOL) 1. Комментарии

Имеется два способа вставки комментариев в программу. Комментарий может начинаться с двух символов //, и в этом случае любые последующие символы этой строки игнорируются компилятором.

Комментарий может также начинаться с символов / и заканчиваться символами /• К такой комментарий можно включать любые символы, и он может занимать несколько строк. Комментарий можно использовать в любом месте программы, если для этого есть место. Однако комментарии не допускают вложенности. Это означает, что комментарий всегда заканчивается символами /, даже если до этого встретилось несколько наборов символов /. Константы Константы целого типа

Константа целого типа (целая константа) – это состоящая из цифр последова-тельность, перед которой может дополнительно ставиться знак «плюс» или «минус». Если первой цифрой является 0, значит, это восьмеричная константа, и тогда следующие цифры должны быть в диапазоне 0-7. Если первой цифрой является О, и сразу после нее следует буква х (или X), значит, это шестнадцатеричная константа, и последующие цифры должны быть в диапазоне 0-9, a-f (или A-F).

В конце десятичной целой константы можно добавить суффикс I или L, и тогда она становится константой типа long int, если умещается в этот размер, иначе она интерпретируется как long long int. И, наконец, если она не умещается в long long int, она и нтерп ретируется как константа типа unsigned long long int.

В конце десятичной целой константы можно добавить суффикс II или LL, чтобы сделать ее long long int. При добавлении этого суффикса в конец восьмеричной или шестнадцатеричной константы, она интерпретируется сначала как long long int, но если не умещается в этот размер, то получает тип unsigned long long int.

В конце целой константы можно добавить суффикс и ИЛИ U, чтобы сделать ее константой без знака (unsigned). Если она не умещается в размер unsigned int, она интерпретируется как unsigned tong int. Если она превышает также этот размер, то интерпретируется как unsigned tong tong int.

Два суффикса – для unsigned и для tong – можно добавить к целой константе, чтобы она имела тип unsigned tong int. Если константа не умещается в этот тип, она обрабатывается как unsigned long long int.

Два суффикса – для unsigned и для tong long – можно добавить к целой кон-станте, чтобы она имела тип unsigned tong tong int.

Если десятичная целая константа без суффиксов слишком велика, чтобы уместиться в тип signed int, она интерпретируется как long int. Если она слишком велика, чтобы уместиться в тип long int, она интерпретируется как long long int.

Если восьмеричная или шестнадцатеричная целая константа без суффик-сов слишком велика, чтобы уместиться в тип signed int, она интерпретируется как unsigned int. Если она слишком велика, чтобы уместиться в тип unsigned int, она интерпретируется как long int, и если она не умещается в этот тип, то интерпретируется как unsigned long int. Если она не умещается в unsigned tong int, то интерпретируется как long tong int. И, наконец, если она слишком велика для tong long int, то интерпретируется как unsigned tong long int. Константы с плавающей точкой

Константа с плавающей точкой состоит из последовательности десятичных цифр, десятичной точки и еще одной последовательности десятичных цифр. Перед значением можно ставить знак «минус» для отрицательных значений. Кроме того, может отсутствовать последовательность цифр до десятичной точки или после нее, но не обе последовательности.

Если в конце константы с плавающей точкой добавлены буква е (или Е) и целое число (с необязательным знаком), константа имеет экспоненциальное представление. Это целое число (порядок) указывает, что значение до буквы е (мантисса) умножается на 10 в степени, равной этому целому числу (например, 1.5е-2 представляет 1.5 X ЮЛ или .015).

Шестнадцатеричная константа с плавающей точкой состоит из ведущих символов Ох или ОХ, после которых следуют одна или несколько десятичных или шестнадцатеричных цифр, затем буква р или Р и затем показатель степени для основания 2 с возможным знаком. Например, ОхЗрЮ представляет значение 3 х 2,с. Константы с плавающей точкой интерпретируются компилятором как значения с двойной точностью (double). Можно добавить суффикс f или F, и тогда константа будет иметь тип float вместо double; можно добавить суффикс I или L, чтобы указать константу типа long double. Символьные константы

Один символ, заключенный в апострофы, является символьной константой. Обработка нескольких символов, заключенных в апострофы, определяется ре-ализацией. В символьной константе можно использовать универсальный символ, чтобы указать символ, не входящий в стандартный набор символов. Escape-последовательности

Специальные escape-последовательности распознаются и вводятся с помощью символа «обратный слэш*. Ниже приводятся эти escape-последовательности. Символ Описание а Звуковой сигнал b Символ Backspace (возврат на одну позицию назад) f Form feed (подача страницы) n Переход на новую строку r Символ возврата каретки t Горизонтальное табулирование v Вертикальное табулирование Обратный слэш " Кавычка ' Апостроф ? Вопросительный знак nnn Восьмеричное значение символа unnn Имя универсального символа Unnnnnnnn Имя универсального символа xnn Шестнадцатеричное значение символа

Для восьмеричного значения символа можно указать от одной до трех восьмеричных цифр. В последних трех случаях используются шестнадцатеричные цифры. Символьные константы из расширенных наборов

Символьная константа из расширенных наборов записывается как L'x'. Такая константа имеет тин wchart, в соответствии с определением в файле . Константы из расширенных наборов символов – это способ представить сим-вол из набора символов, который не может быть полностью представлен с помощью обычного тина char. Константы символьных строк

Последовательность, содержащая нуль или более символов, заключенных в кавычки, представляет константу символьной строки (строковую константу). В эту строку можно включить любой допустимый символ, в том числе любой из показанных выше escape-символов. Компилятор автоматически вставляет нуль– символ ( ) в конце этой строки.

Обычно компилятор создаст указатель на первый символ строки, имеющий тип «указатель на char». Но если строковая константа используется с оператором sizeof для инициализации массива символов или с оператором &, то строковая константа имеет тип «массив элементов типа char».

Константы символьных строк не могут быть изменены программой. Конкатенация символьных строк

Препроцессор автоматически выполняет конкатенацию смежных строковых констант. Строки могут быть любым числом пробелов. Таким образом, три строки "a" "character" "string"

эквивалентны одной строке "a character string" после конкатенации. Многобайтные символы

Для перехода между различными состояниями в символьной строке можно использовать последовательности символов, определенные реализацией, что позволяет включать многобайтные символы. Строковые константы из расширенных наборов

Строковые константы из расширенного набора символов представляются в формате L'...'. Каждая такая константа имеет тип «указатель на wchar_t, где wchar_t определяется в . Объекты константных символьных строк

Для создания объекта константной символьной строки нужно поместить сим-вол @ перед константной символьной строкой. Этот объект имеет типа NSConstantString.

Для смежных объектов константных символьных строк выполняется кон-катенация. Таким образом, три строковых объекта @"а" @" character " @"string"

эквивалентны одному строковому объекту @"а character string" Константы перечислимого типа

Идентификатор, который объявлен как значение для перечислимого типа, рассматривается как константа этого типа, но интерпретируется компилятором как тип int. Типы и объявления данных

В этом разделе приводится сводка базовых типов данных, производных типов данных, перечислимых типов данных, а также typedef. Здесь также приводится формат объявления переменных. Объявления

При определении какой-либо структуры, объединения (union), перечислимого типа данных или typedef компилятор не резервирует память автоматически. Из определения компилятор просто получает информацию об определенном типе данных и (необязательно) связывает с ним определенное имя. Такое определение можно делать внутри или вне функции или метода. В первом случае только данная функция или метод «знает» о его существовании; во втором случае определение распространяется на весь файл.

После того, как создано определение, можно объявлять переменные с этим типом данных. Для переменной любого типа данных будет выделена память, если только это не объявление extern (в этом случае память может быть выделена или не выделена, см. ниже раздел «Классы памяти и область действия».

Язык Objective-C позволяет также выделять память одновременно с объяв-лением определенной структуры, объединения или перечислимого типа дан-ных. Для этого нужно просто перечислить соответствующие переменные, прежде чем завершить определение символом «точка с запятой». Базовые типы данных

Базовые типы данных приводятся в таблице В.З. Чтобы объявить переменную с определенным типом данных, нужно использовать формат тип имя = начальное_значение;

Присваивание начального значения переменной не является обязательным и подчиняется правилам, описанным ниже в разделе «Переменные». Для объявления нескольких переменных используется формат тип имя = начальное_значение, имя = начальное_значение, ...;

Перед объявлением типа можно дополнительно указать класс памяти, что описывается ниже в разделе «Переменные*. Если указан класс памяти и пере-менная должна иметь тип int, то int можно опустить. Например, static counter;

объявляет counter как переменную static int.

Табл. В.З. Сводка базовых типов данных Тип Описание int Целое значение, то есть значение, не содержащее десятичной точки; имеет точность не менее 32 бит. short int Целое значение, которое занимает половину памяти по сравнению с типом int на некоторых машинах; имеет точность не менее I6 бит. long int Целое значение увеличенной точности; имеет точность не менее 32 бит. long long int Целое значение дополнительно увеличенной точности; имеет точность не менее 64 бит. unsigned int Положительное целое значение; может содержать положительные значения, вдвое больше, чем int; имеет точность не менее 32 бит. float Значение с плавающей точкой, то есть может содержать знаки после десятичной точки; имеет точность не менее 6 цифр. double Значение с плавающей точкой увеличен ной точности; имеет точность не менее 10 цифр. long double Значение с плавающей точкой дополнительно увеличенной точности; имеет точность не менее 10 цифр. char Значение с одним символом; на некоторых машинах может добавляться знак при использовании в выражении. unsigned char То же самое, что и char, за исключением того, что в случае преобразования в целое значение не будет добавляться знак. signed char То же самое, что и char, за исключением того, что в случае преобразования в целое значение будет добавляться знак. _Bool Булев тип; хранит значение 0 или 1. float _Complex Комплексное число. double _Complex Комплексное число увеличенной точности. long double _Complex Комплексное число дополнительно увеличенной точности. void Не обозначает никакого типа; используется при объявлении функции или метода, не возвращающих никакого значения, или для явной отмены результатов выражения; используется также как обобщенный тип указателя (void *)

Отметим, что модификатор signed можно также указывать перед типами short irrt, int, long int и long long int. Поскольку эти типы всегда используются со знаком, модификатор не оказывает на них дополнительного влияния.

Типы данных Complex и .Imaginary позволяют объявлять комплексные и мнимые числа и работать с ними с помощью функций из библиотеки, поддерживающей арифметические операции с этими типами. Обычно следует включать в свою программу файл , где определяются макросы и объявляются функции для работы с комплексными и мнимыми числами. Например, переменную d типа double .Complex можно объявить и инициализировать со значением 5 + 10.5i с помощью оператора double .Complex cl = 5 + 10.5 * I;

Затем можно использовать библиотечные процедуры creal и cimag для извлечения вещественной и мнимой частей d соответственно.

Используемая реализация не обязательно поддерживает типы Complex и Jmaginary. Она может поддерживать один тип и не поддерживать другой. Производные типы данных

Производный (derived) тип данных формируется из одного или нескольких базовых типов данных. Производными типами данных являются массивы, структуры, объединения и указатели (включая объекты). Функция или метод, которые возвращают значение указанного типа, также считаются производным типом данных. Функции и классы описываются по отдельности соответственно в разделах «Функции» и «Классы». Массивы Одномерные массивы

В определении массива может содержаться любой базовый тип данных или любой производный тип данных. Массивы функций не допускаются (хотя разрешается использовать массивы указателей на функции).

Объявление массива имеет следующий основной формаi. тип имя[n] = { Выражение инициализации, Выражение_инициализации, ..);

Выражение п определяет число элементов массива с этим именем, и его можно опустить, если задан список начальных значений. В этом случае размер массива определяется числом заданных начальных значений или элементом с максимальным указанным номером, если используются назначенные инициализаторы.

Если определяется глобальный массив, каждое начальное значение должно быть константным выражением. Число значений в списке инициализации мо-жет быть меньше числа элементов массива (но не больше). Если задано меньше значений, то инициализируется только соответствующее число элементов массива; остальным элементам присваивается значение 0.

Особым случаем инициализации массива являются массивы символов, ко-торые можно инициализировать с помощью константной символьной строки. Например, char today(] = "Monday";

объявляет today как массив символов. Элементы этого массива инициализируются в виде начальных значений соответственно символами 'М'.'о', 'n', 'd', 'а', 'у' и '

Если объявить явным образом размер массива, не оставив элемента для конечного нуль-символа, то компилятор не поместит нуль-символ в конце массива. char today[6] = "Monday";

В этом объявлении today является массивом из шести символов, и его эле-ментам присваиваются соответственно символы ’М 'o', *n', ЧГ, 'а' и ’у’.

Указывая элементы в прямоугольных скобках, можно инициализировать конкретные элементы массива в любом порядке. Например, ниже объявляется массив из Ю элементов с именем а (число элементов массива определяется элементом с максимальным указанным номером), а также задается начальное значение х + 1 (1234) для последнего элемента и значения 1,2,3 соответственно для первых трех элементов. int х = 1233; int а[] = { |9] = х + 1, [2] = 3, [1] = 2, [0] = 1 }; Массивы переменной длины

Внутри функции, метода или блока можно задать размер массива, используя выражение, содержащее переменные. В этом случае размер вычисляется на этапе выполнения. Например, функция int makeVals (int n) { int valArray[n]; }

определяет автоматический массив с именем valArray и размером п элементов, где п вычисляется на этапе выполнения программы и может быть различным при различных вызовах этой функции. Массивы переменной длины нельзя инициализировать. Многомерные массивы

Объявление многомерного массива имеет основной формат тип имя[n] = [d1][d2]...[dn] = списокИнициализации

Здесь определяется, что массив с этим именем содержит dl xd2x...x dn эле-ментов указанного типа. Например, int three_d [5] [2] [20];

определяет трехмерный массив three_d, содержащий 200 целых элементов.

Отдельный элемент многомерного массива указывается набором индексов каждой размерности, каждый из которых заключен в отдельные прямоуголь-ные скобки. Например, выражение three.d [4][0][15] = 100;

присваивает значение 100 указанному элементу массива three_d.

Многомерные массивы можно инициализировать таким же образом, как одномерные. Для управления присваиванием значений элементам массива можно использовать вложенные пары фигурных скобок.

Ниже матрица определяется как двумерный массив, содержащий четыре строки и три столбца. int matrix[4][3] = {{1,2,3}, { 4, 5, 6 }, { 7, 8, 9 } };

Элементам первой строки матрицы присваиваются соответственно значе-ния 1,23; элементам второй строки – 4,5,6; и элементам третьей строки – 7, 8, 9. Элементам четвертой строки присваивается значение 0, поскольку для этой строки значения не заданы. Объявление int matrix[4][3] = { 1,2, 3, 4, 5, 6, 7, 8,9};

инициализирует матрицу, содержащую те же значения, поскольку элементы многомерного массива инициализируются в порядке размерностей, то есть от левой размерности к правой. Объявление int matrix[4][3] = {1}, {4}, {7}};

присваивает 1-му элементу 1-й строки матрицы значение 1, 1-му элементу 2-й строки – значение 4 и I -му элементу 3-й строки – значение 7. Всем остальным элементам присваивается по умолчанию значение 0.

И, наконец, объявление int matrix[4][3] = {[0][0] = 1, [1][1] = 5, [2][2] = 9};

инициализирует для указанных элементов матрицы заданные значения. Структуры Общий формат struct имя { объявлениеКомпонента объявлениеКомпонента } списокПеременнык,

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

Переменные можно объявить непосредственно во время определения структуры, указав их перед завершающим символом «точка с запятой», или их можно объявить в дальнейшем, используя формат struct имя список именПеременнык,

Этот формат нельзя использовать, если в определении структуры не указано имя. В этом случае все переменные структуры должны быть объявлены с помощью определения.

Формат инициализации переменной-структуры аналогичен формату для массивов. Компоненты структуры можно инициализировать, заключив список начальных значений в фигурные скобки. Каждое значение в этом списке должно быть константным выражением, если инициализируется глобальная структура.

В объявлении struct point { float х; float у; } start = {100.0, 200.0};

определяется структура с именем point и переменная-структура с именем start с указанными начальными значениями. Конкретные компоненты структуры можно задавать для инициализации в любом порядке с помощью формы записи .компонент = значение

в списке инициализации, например, struct point end = {.у = 500, .х = 200 };

В объявлении struct entry { char *word; char *def; } dictionary[1000] = { {"a", "first letter of the alphabet"}, {"aardvark", "a burrowing African mammal"}, {"aback", "to startle" } };

объявляется словарь, содержащий 1000 структурных записей, причем первые три элемента инициализируются как указатели на указанные символьные строки. Используя назначенные инициализаторы, можно записать это следующим образом. struct entry { char *word; char *def; } dictionary! 1000] = { [0].word = "a", (0].def = "first letter of the alplmet", [t].word = "aardvark", [1 J.def = "a burrowing African mammal", [2].word = "aback", [2].def = "to startle" };

или в эквивалентной форме Struct entry { char *word; char *def; } dictionary[ 1000] = { { {.word = "a", .def = "first letter of the alphabet"}, {.word = "aardvark", .def = "a burrowing African mammal"), {.word = "aback", .def = "to startle") );

Автоматическую переменную-структуру можно инициализировать, присвоив ей другую структуру того же типа, например, struct date tomorrow = today;


    Ваша оценка произведения:

Популярные книги за неделю