ОПЕРАЦИИ С УКАЗАТЕЛЯМИ 

ОПЕРАЦИИ С УКАЗАТЕЛЯМИ 

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

/* операции с указателями */

#define PR(X)

printf("X = %u,*X = %d, &X = %u ",X, *X,&X);

/* печатает значение указателя (адрес),

            значение, находящееся по */

/* этому адресу, и адрес самого указателя */

main( )

static int urn[ ] = [100, 200, 300];

int *ptrl, *ptr2;

{

ptrl = urn; /* присваивает адрес указателю */

ptr2 = &urn [2]; /* то же самое */

PR(ptrl); /* см. макроопределение, указанное выше */

ptrl++; /* увеличение указателя */

PR(ptrl);

PR(ptr2);

++рtr2; /* выходит за конец массива */

PR(ptr2);

printf("ptr2 - ptrl = %u ", ptr2 - ptrl);

}

В результате работы программы получены следующие результаты:

ptrl = 18, *ptrl = 100, &ptrl = 55990

ptrl = 20, *ptrl = 200, &ptrl = 55990

ptr2 =22, *ptr2 = 300, &ptr2 = 55992

ptr2 =24, *ptr2 = 29808, &ptr2 = 55992

ptr2 - ptrl = 2

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

1. ПРИСВАИВАНИЕ. Указателю можно присвоить адрес. Обычно мы выполняем это действие, используя имя массива или операцию получения адреса (&). Программа присваивает переменной ptrl адрес начала массива urn; этот адрес принадлежит ячейке памяти с номером 18. (В нашей системе статические переменные запоминаются в ячейках оперативной памяти.) Переменная ptr2 получает адрес третьего и последнего элемента массива, т. е. urn[2].

2. ОПРЕДЕЛЕНИЕ ЗНАЧЕНИЯ. Операция выдает значение, хранящееся в указанной ячейке. Поэтому результатом операции *ptrl в самом начале работы программы является число 100, находящееся в ячейке с номером 18.

3. ПОЛУЧЕНИЕ АДРЕСА УКАЗАТЕЛЯ. Подобно любым переменным переменная типа указатель имеет адрес и значение. Операция & сообщает нам, где находится сам указатель. В нашем примере указатель ptrl находится в ячейке с номером 55990. Эта ячейка содержит число 18, являющееся адресом начала массива urn.

4. УВЕЛИЧЕНИЕ УКАЗАТЕЛЯ. Мы можем выполнять это действие с помощью обычной операции сложения либо с помощью операции увеличения. Увеличивая указатель, мы перемещаем его на следующий элемент массива. Поэтому операция ptr1++ увеличивает числовое значение переменной ptrl на 2 (два байта на каждый элемент массива целых чисел), после чего указатель ptrl ссылается уже на urn[l] (рис. 12.2). Теперь ptrl имеет значение 20 (адрес следующего элемента массива), а операция *ptrl выдает число 200, являющееся значением элемента urn[1]. Заметим, что адрес самой ячейки ptrl остается неизменным, т.е. 55990. После выполнения операции сама переменная не переместилась, потому что она только изменила значение!

РИС. 12.2. Увеличение указателя типа int.

     Аналогичным образом можно и уменьшить указатель. Однако при этом следует соблюдать осторожность. Машина не следит, ссылается ли еще указатель на массив или уже нет. Операция ++ptr2 перемещает указатель ptr2 на следующие два байта, и теперь он ссылается на некоторую информацию, расположенную в памяти за массивом.

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

Правильно Неправильно
ptr1++; urn ++;
х ++; 3++;
ptr2 = ptr1 + 2; ptr2 = urn++;
ptr2 = urn + 1; х = у + 3++;

5. РАЗНОСТЬ. Можно находить разность двух указателей. Обычно это делается для указателей, ссылающихся на элементы одного и того же массива, чтобы определить, на каком расстоянии друг от друга находятся элементы. Помните, что результат имеет тот же тип, что и переменная, содержащая размер массива.

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Операции

Из книги Модель зрелости процессов разработки программного обеспечения автора Паулк Марк

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


Операции += и -=

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Операции += и -= Если вы изучаете C#, уже имея опыт использования C++, то можете обратить внимание на отсутствие возможности перегрузки операторных сокращений, включающих операцию присваивания (+=, -= и т.д.). Не волнуйтесь, в C# операторные сокращения с присваиванием


Код операции MI

Из книги Основы AS/400 автора Солтис Фрэнк

Код операции MI В таблице 4.14 показано назначение битов кода операции MI. Бит 3 задает вычислительный или невычислительный формат команды. Во втором случае функция, которая должна быть выполнена, закодирована в битах 5-15 кода операции. Функция, выполняемая вычислительной


16.1. Операции tty

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

16.1. Операции tty Устройства tty предоставляют огромное количество опций обработки данных; они относятся к наиболее сложным устройствам ядра. Настраивать можно опции обработки входных и выходных данных, а также потока данных. Также можно контролировать ограниченное


Операции

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.


Операции

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Операции Операции в языке Си имеют либо один операнд (унарные операции), либо два операнда (бинарные операции), либо три (тернарная операция). Операция присваивания может быть как унарной, так и бинарной (см. раздел 4.4).Существенным свойством любой операции является ее


Унарные операции

Из книги C++ для начинающих автора Липпман Стенли

Унарные операции Унарный минус (-)Операция унарного минуса выполняет арифметическое отрицание своего операнда. Операнд должен быть целым или плавающим значением. Выполняются преобразования операнда по умолчанию. Тип результата совпадает с преобразованным типом


Логические операции

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

Логические операции Логические операции выполняют над своими операндами логические функции И (&&) и ИЛИ (||). Операнды логических операций могут иметь целый, плавающий тип, либо быть указателями. Типы первого и второго операндов могут различаться. Сначала всегда


Резюме: операции, связанные с указателями

Из книги автора

Резюме: операции, связанные с указателями I. Операция получения адреса &     Когда за этим знаком следует имя переменной, результатом операции является адрес указанной переменной. Пример:&nurse     дает адрес переменной nurse. II. Операция косвенной адресации*     Когда


ОПЕРАЦИИ С УКАЗАТЕЛЯМИ 

Из книги автора

ОПЕРАЦИИ С УКАЗАТЕЛЯМИ      Что же мы теперь умеем делать с указателями? Язык Си предлагает пять основных операций, которые можно применять к указателям, а нижеследующая программа демонстрирует эти возможности. Чтобы показать результаты каждой операции, мы будем


Операции

Из книги автора

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


Операции

Из книги автора

Операции Теперь рассмотрим, что можно и нельзя делать с величинами типа enum. Вы можете присвоить константу типа enum переменной того же типа enum feline pet;pet = tiger;Нельзя использовать другие операции присваивания: pet += cat; /* недопустимо */Можно провести сравнение с целью выявления


4.3. Операции сравнения и логические операции

Из книги автора

4.3. Операции сравнения и логические операции Символ операции Значение Использование ! Логическое НЕ !expr меньше exprexpr = Меньше либо равно expr=expr больше exprexpr = больше либо равно expr=expr == равно expr==expr != не равно expr!=expr логическое


13.6.2. Работа с указателями на члены класса

Из книги автора

13.6.2. Работа с указателями на члены класса К указателям на члены класса можно обращаться только с помощью конкретного объекта или указателя на объект типа класса. Для этого применяется любой из двух операторов доступа (.* для объектов класса и ссылок на них или -* для


Операции с указателями

Из книги автора

Операции с указателями Ко всем указателям применимы операции сравнения = и <>.К типизированным указателям применима операция разыменования ^: если p является указателем на тип T, то p^ - элемент типа T, на который указывает p. Указатели pointer разыменовывать


Операции is и as

Из книги автора

Операции is и as Операция is предназначена для проверки того, имеет ли классовая переменная указанный динамический тип. Операция as позволяет безопасно преобразовать переменную одного классового типа к другому классовому типу (в отличие от явного приведения классового