Массив С (K&R 5.3) состоит из нескольких элементов одного и того же типа данных.

Объявление массива указывает тип данных элементов, за которым следует имя массива, а за ним - квадратные скобки, в которых указано количество элементов в массиве:

int arr[3]; // arr является массивом из трех 3 int

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

int arr(3];
arr[O] 123;
arr[l] = 456;
arr[2] = 789;

Можно также инициализировать массив во время объявления, присваивая ему список значений в фигурных скобках, так же, как и в случае структуры. В таком случае размер массива в объявлении можно опустить, так как неявно он указывается списком значений инициализации (K&R 4.9):

int arr[] = {123, 456, 789};

.Указатели и присваивание

Рис. 1.1.Указатели и присваивание

Интересно, что имя массива является также именем указателя на первый элемент массива. Таким образом, например, имея показанное выше объявление массива, можно использовать arr там, где ожидается значение типа int* (указатель на int). Этот факт является основой некоторых высокоинтеллектуальных идиом языка программирования С, которые вам определенно не требуется знать (именно поэтому я и не рекомендовал вам читать из главы 5 K&R что-либо, кроме первых трех разделов).

Вот пример, в котором массив С может оказаться полезным при программировании для IOS. Функция CGContextStrokeLineSegments объявлена следующим образом:

void CGContextStrokeLineSegments(
CGContextRef с,
const CGPoint points[],
size t count
);

Вторым параметром функции передается С-массив элементов типа CGPoint (об этом говорят следующие за именем параметра квадратные скобки). Таким образом, для вызова функции необходимо знать, как минимум, как создать такой массив. Это можно сделать, например, с помощью следующего кода:

CGPoint arr[] = {{4,5}, {6,7}, {8,9}, {10,11}};

После этого можно передать аrr в качестве второго аргумента в вызов функции

CGContextStrokeLineSegments.
<

Кроме того, как я упоминал, С-строка в действительности представляет собой массив. Например, метод NSString с именем stringWi thUTF8String: получает (согласно документации) "С-массив байтов в кодировке UТF8 с завершающим нулевым символом~ но этот параметр объявлен не как массив, а как char*. Это одно и то же, и оба способа говорят, что данный метод принимает С-строку.

(Двоеточие после имени метода stringWi thUTF8String: - не опечатка; имена многих методов Objective-C заканчиваются двоеточием. Почему - я объясню в главе 3.)


 

 

 

Добавить комментарий