Программирование на Objective-C 2.0
Шрифт:
инициализирует для указанных элементов матрицы заданные значения. Структуры Общий формат 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;
Здесь объявляется переменная-структура типа date с именем tomorrow, и ей присваивается содержимое (ранее объявленной) переменной-структуры типа date с именем today.
ОбъявлениеКомпонента, которое имеет формат тип имяПоля: n
определяет доле длиной п бит внутри структуры, где п — целое значение. Поля могуг располагаться слева направо на одних машинах и справа налево на других. Если имяПоля опущено, то резервируется указанное число битов, но без ссылки. Если имяПоля опушено и п равно 0, то следующее поле выравнивается по границе следующего блока памяти, где размер блока зависит от реализации. Поле может иметь тип int, signed int или unsigned int. В зависимости от реализации поле типа int интерпретируется как signed или unsigned. К полю нельзя применять адресный оператор (&), и нельзя определять массивы молей. Объединения Общий формат union имя { ОбъявлениеКомпонента ОбъявлениеКомпонента } списокПеременных,
Здесь определяется объединение с заданным именем и компонентами, соот-ветствующими каждому объявлениюКомпонента.
Каждый компонент объединения использует общую область памяти, и компилятор обеспечивает резервирова-ние области памяти, достаточной, чтобы вместить самый большой компонент данного объединения.Переменные можно объявить непосредственно во время определения объединения, или их можно объявить в дальнейшем, используя форму записи union имя список именПеременнык,
при условии, что объединению было присвоено имя при его определении.
Программист сам должен следить за тем, чтобы значение, считываемое из объединения, соответствовало типу значения, которое было в последний раз сохранено в объединении. Первый компонент объединения можно инициали-зировать, заключив в фигурные скобки начальное значение, которое в случае глобальной union-переменной должно быть константным выражением. union shared { long long int I; long int w[2]; } swap = { Oxffffffff};
Для инициализации другого компонента нужно указать имя этого компо-нента, как в union shared swap2 = {.w[0] = 0x0, .w[1] = Oxffffffff };
Здесь объявляется union-переменная swap, и ее компоненту I присваивается шестнадцатеричное значение ffffffff.
Автоматическую union-переменную можно также инициализировать, при-своив ей объединение того же типа, например, union shared swap2 = swap; Указатели
Объявление переменной-указателя имеет базовый формат тип *имя,
Идентификатор имя объявляется с типом «указатель на тип»; типом может быть какой-либо базовый тип данных или производный тип данных. Например, int *ip;
объявляет ip как указатель на тип int, и struct entry *ер;
объявляет ер как указатель на структуру entry. Если определен класс Fraction, то Fraction "myFract;
объявляет myFract как объект типа Fraction, или, точнее, myFract используется для хранения указателя на структуру данных объекта после того, как создан экземпляр объекта и он присвоен этой переменной.
Указатели, которые указывают на элементы массива, объявляются для указания на тип элемента, содержащегося в этом массиве. Например, предыдущее объявление ip можно было бы также использовать для объявления указателя на массив целых элементов.
Допускаются также более сложные формы объявлений указателей. Напри-мер, char *tp[100];
объявляет tp как массив из 100 указателей на тип char, и struct entry (*fnPtr) (int);
объявляет fnPtr как указатель на функцию, которая возвращает структуру entry и принимает один аргумент типа int.
Можно проверить, является ли указатель пустым (null), сравнив его с кон-стантным выражением, значение которого равно 0. В реализации можно выб-рать внутреннее представление null-указателя в виде значения, отличного от 0. Однако сравнение между указателем с таким внутренним представлением и константным значением 0 должаю показывать равенство.
Преобразование указателей в целые значения и целых значений в указате-ли, а также размер целой переменной, необходимой для хранения указателя, зависят от типа машины.
Тип «указатель на void» — это обобщенный тип указателя. Язык Objective-C гарантирует, что указатель любого типа может быть присвоен void-указателю, и затем можно выполнить обратное присваивание без изменения его значения.
Тип id — это обобщенный указатель на объект. Любой объект любого класса может быть присвоен id-псременной, и наоборот.