Шрифт:
Преобразование указателей в целые значения и целых значений в указате-ли, а также размер целой переменной, необходимой для хранения указателя, зависят от типа машины.
Тип «указатель на void» — это обобщенный тип указателя. Язык Objective-C гарантирует, что указатель любого типа может быть присвоен void-указателю, и затем можно выполнить обратное присваивание без изменения его значения.
Тип id — это обобщенный указатель на объект. Любой объект любого класса может быть присвоен id-псременной, и наоборот.
За исключением этих двух особых случаев присваивание указателей различного типа не допускается, и обычно при такой попытке компилятор выдает предупреждающее сообщение. Перечислимые типы данных
Общий формат enum имя { епит_ /, епит_2,..} списокПеременнык,
Перечислимый тип с заданным именем определяется с перечисляемыми значениями enum l, епит_2,..., каждое из которых является идентификатором или идентификатором, после которого следует знак равенства и константное выра-жение. Можно также объявить спиажПеременных (с необязательными начальными значениями), и эти переменные будут иметь тип enum имя.
Компилятор присваивает перечисляемым идентификаторам последовательные целые значения, начиная с 0. Если идентификатор указан со знаком = и константным выражением, то идентификатору присваивается значение этого выражения. Последующим идентификаторам присваиваются значения, начиная со значения этого константного выражения плюс 1. Перечисляемые идентификаторы интерпретируются компилятором как константные целые значения.
Если нужно объявить переменную определенного ранее (и именованного) перечислимого тина, можно использовать конструкцию enum имя списокПеременных,
Если объявлена переменная определенного перечислимого типа, то ей мож-но присвоить значение только того же типа, хотя компилятор, возможно, не зарегистрирует это как ошибку. typedef
Оператор typedef используется, чтобы присвоить новое имя базовому или производному типу данных. Этот оператор не определяет какой-либо новый тип, а просто назначает новое имя для существующего типа. Поэтому переменные, объявленные с типом, имеющим новое имя, интерпретируются компилятором точно так же, как с типом, для которого дополнительно назначено это новое имя.
Создавая определение typedef, нужно действовать, как при объявлении обычной переменной. При этом нужно поместить новое имя типа там, где обычно ставится имя переменной. И, наконец, перед всем этим нужно поставить ключевое слово typedef.
В показанном ниже примере typedef struct { float х; float у; } POINT;
имя POINT связывается со структурой, содержащей два компонента типа float с именами х и у. Затем можно объявлять переменные типа POINT, например, POINT origin = {0.0, 0.0}; Модификаторы типа: const, volatile и restrict
Перед объявлением типа можно помещать ключевое слов const, чтобы сообщить компилятору, что это значение нельзя изменять. Например, const int х5= 100;
объявляет х5 как постоянную целую переменную — ей нельзя присвоить другое значение во время выполнения программы. Компилятор не обязательно будет реагировать на попытки изменения значения такой переменной.
Модификатор volatile явно указывает компилятору, что значение изменяется (обычно динамически). Если в выражении используется volatile-переменная, доступ к ее значению разрешается в любом месте, где она появляется.
Чтобы объявить переменную port17 как тип «volatile-указатель на char», можно написать следующую строку. char *volatile port 17;
С указателями можно использовать ключевое слово restrict. Это указание компилятору на возможность оптимизации (аналогично ключевому слову register для переменных). Ключевое слово restrict сообщает компилятору, что данный указатель будет единственной ссылкой на определенный объект, то есть не будет указываться никаким другим указателем в пределах той же области действия. Строки int * restrict intPtrA; int * restrict intPtrB;
сообщают компилятору, что в пределах области действия, где определены intPtrA и intPtrB, они никогда не будут указывать на одно и то же значение. Их использование для указания целых значений (например, в массиве) будет взаимоисключающим. Выражения
Имена переменных, имена функций, выражения в виде сообщений, имена массивов, константы, вызовы функций, ссылки на массивы, а также ссылки на структуры и объединения — все это интерпретируется как выражения. Применение унарного (одноместного) оператора к этим выражениям (в допустимых случаях) тоже является выражением, как и сочетание этих выражений с помощью бинарного (двумсстно1>) или тернарного (трехместного) оператора. И, наконец, выражение, заключенное в круглые скобки, тоже является выражением.