Чтение онлайн

на главную - закладки

Жанры

Программирование на Objective-C 2.0
Шрифт:

Перепишем программу 13.6, где впервые показали использование структур, с применением указателей структур (программа 13.10). // Программа, показывающая использование указателей структур #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; struct date { int month; int day; int year; }; struct date today, *datePtr; datePtr = &today; datePtr->month = 9; datePtr->day = 25; datePtr->year = 2009; NSLog (@"Today's date is %i/%i/%.2i.", datePtr->month, datePtr->day, datePtr->year % 100); (pool drain]; return 0; }

Вывод

программы 13.10 Today's date is 9/25/09. (Текущая дата - 25.9.09) Указатели, методы и функции

Вы можете передавать указатель как аргумент методу или функции. Метод или функция может возвращать результат в виде указателя. Кстати, именно это про-исходит с методами alloc и init: они возвращают указатели. Более подробно мы обсудим этот вопрос в конце главы. А теперь рассмотрим программу 13.11. // Указатели как аргументы, передаваемые функциям #import <Foundation/Foundation.h> void exchange (int *pint1, int *pint2) { int temp; temp = *pint1; *pint1 = *pint2; *pint2 = temp; } int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; void exchange (int *pint1, int *pint2); int И = -5, i2 = 66, *p1 = &i1, *p2 = &i2; NSLog (@"i1 = %i, i2 = %i", i1, i2); exchange (p1, p2); NSLog (@"i1 = %i, i2 = %i", i1, i2); exchange (&i1, &i2); NSLog (@"i1 = %i, i2 = %i", i1, i2); [pool drain]; return 0; }

Вывод программы 13.11 i1 =-5, i2 = 66 i1 = 66, i2 = -5 i1 = -5, i2 = 66

Функция exchange выполняет обмен значений двух целых переменных, на которые указывают два ее аргумента. Внутри функции локальная целая переменная temp сохраняет одно из целых значений во время выполнения обмена. Ей присваивается целое значение, на которое указывает pintl. Затем целое значение, на которое указывает pint2, копируется в целую переменную, на которую указывает pintl. После этого значение temp сохраняется в целой переменной, на которую указывает pint2, и обмен значениями завершается.

В процедуре main определяются целые переменные И и i2 со значениями -5 и 66 соответственно. Затем определяются два указателя на тип int (pi и р2), которые указывают соответственно на И и 12. Программа выводит значения И и i2 и вызывает функцию exchange, передавая в качестве аргументов эти указатели (р1 и р2). Функция exchange выполняет обмен значения, содержащегося в целой пе-ременной, на которую указывает pi, со значением, содержащимся в целой пе-ременной, на которую указывает р2. Поскольку р1 указывает на il и р2 на i2, функция exchange обменивает местами значения И и i2. Вывод с помошью второго вызова NSLog показывает, что обмен выполняется правильно.

Второй вызов exchange выглядит несколько интересней. На этот раз аргумен-ты, передаваемые функции, являются указателями на И и i2, которые создаются непосредственно при обращении в результате применения к этим переменным адресного оператора &. Поскольку выражение &И представляет указатель на целую переменную И, это согласуется с типом первого аргумента для функции (указатель на целое значение). То же самое относится ко второму аргументу. Вывод этой программы показывает, что функция exchange правильно выполнила свою работу и

обменяла значения И и i2.

Внимательно изучите программу 13.11. Она показывает ключевые концепции работы с указателями в Objective-C. Указатели и массивы

Если имеется массив с именем values, содержащий 100 целых элементов, то с помощью следующей строки можно определить указатель с именем valuesPtr, который можно использовать для доступа к целым элементам, содержащимся в этом массиве. int *valuesPtr;

Определяя указатель, который будет использоваться для указания элементов массива, мы не определяем его как «указатель на массив». Он определяется как указатель на тип элементов, содержащихся в массиве.

Если имеется массив tracts с объектами класса Fraction, то с помощью следующего оператора можно определить указатель на элементы массива tracts: Fraction **fractsPtr;

Такое же объявление используется для определения любого объекта класса Fraction.

Чтобы valuesRr указывал на первый элемент массива values, достаточно напи-сать строку valuesPtr = values;

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

Эквивалентный способ создать указатель на начало массива values — приме-нить адресный оператор & к первому элементу этого массива: valuesPtr = &values[0];

Чтобы вывести содержащийся в массиве tracts объект класса Fraction, на кото-рый указывает fractsPtr, нужно написать оператор [*fractsPtr print];

Реальные возможности применения указателей к массивам начинают дей-ствовать при необходимости перебора элементов массива. Если указатель valuesPtr определен, как описано выше, и указывает на первый элемент массива values, то для доступа к первому элементу массива values (то есть values[0]) можно использовать выражение *valuesPtr

Для доступа к values[3] с помощью переменной valuesPtr можно добавить 3 к valuesPtr и затем применить оператор косвенного доступа. *(valuesPtr + 3)

Таким образом, доступ к значению, содержащемуся в values[i], дает выраже-ние *(valuesPtr + i)

Например, чтобы присвоить элементу values[10] значение 27, можно написать следующее выражение values[10] = 27;

Или, используя valuesPtr, можно написать *(valuesPtr + 10) = 27;

Чтобы valuesPtr указывал на второй элемент массива values, нужно применить адресный оператор & к values[1] и присвоить результат переменной valuesPtr: valuesPtr = &values[1];

Если valuesPtr указывает на values[0], и нужно сделать так, чтобы он указывал на values[1], достаточно добавить 1 к значению valuesPtr: valuesPtr += 1;

Это вполне допустимое выражение в Objective-C, его можно использовать для указателей на любой тип данных.

В общем случае, если а — массив элементов типа х, рх — указатель на х, i и п — целые константы, то в выражении рх = а;

рх указывает на первый элемент а, и выражение *{рх + i)

дает доступ к значению, содержащемуся в a[i]. Кроме того, в выражении рх += п;

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

Развод с драконом. Отвергнутая целительница

Шашкова Алена
Фантастика:
фэнтези
4.75
рейтинг книги
Развод с драконом. Отвергнутая целительница

Стражи душ

Кас Маркус
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стражи душ

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Последний Паладин. Том 13

Саваровский Роман
13. Путь Паладина
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 13

Правильный лекарь. Том 7

Измайлов Сергей
7. Неправильный лекарь
Фантастика:
городское фэнтези
аниме
попаданцы
5.00
рейтинг книги
Правильный лекарь. Том 7

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Я уже князь. Книга XIX

Дрейк Сириус
19. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я уже князь. Книга XIX

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Железный Воин Империи II

Зот Бакалавр
2. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Железный Воин Империи II

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Искатель 3

Шиленко Сергей
3. Валинор
Фантастика:
попаданцы
рпг
фэнтези
5.00
рейтинг книги
Искатель 3

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

Офицер Красной Армии

Поселягин Владимир Геннадьевич
2. Командир Красной Армии
Фантастика:
попаданцы
8.51
рейтинг книги
Офицер Красной Армии

Тринадцатый VI

NikL
6. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VI