Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
      1. Операция взятия адреса для указателя. Указатели на указатели

Пусть имеется следующий фрагмент программы

//.. int n = 5; int *p = &n; int **pp = &p;

Переменная ppявляется указателем на указатель или двухуровневым указателем. Эта переменная получена применением оператора взятия адреса & к указателюp. Указатели на указателиприменяются на практике. Например, в качестве параметров функций (см. прототип функцииstrtok).

      1. Указатели и операция индексирования

Рассмотрим следующий фрагмент программного кода:

#define MSIZE 5 #include <stdio.h> int main(void) { int x[MSIZE] = {1, 3, 5, 7, 9}; int *p = &x[1]; printf(“p[1] = %d”, p[1]); // .. }

В рассматриваемом фрагменте программы объявлен указатель p, который инициализирован адресом второго элемента массиваx. Затем функцииprintf() к указателюpприменен оператор индексные скобки []. В результате выполнения этого фрагмента программы на экране получимp[1] = 5.

      1. Арифметические операции с указателями

Арифметические операции применяются к укзателям, которые работают с массивами. К числу допустимых арифметических операций к таким указателям относятся:

  • ++ (инкремент),

  • --(декремент),

  • сложение с целым числом,

  • вычитание целого числа.

  • вычисление разности двух указателей.

Рассмотрим слеющий программный код:

#define MSIZE 5 #include <stdio.h> int main(void) { int x[MSIZE] = {1, 3, 5, 7, 9}; int *p1 = &x[1]; int *p2 = &x[3]; // .. }

В этом программном коде объявлены указатели p1 иp2, инциализированныtадресами элементов массиваx. Допустимы следующие выражения с этими указателями:

  • p1++ и ++p1,

  • p1-- иp1--,

  • p1 + 2 иp2 – 2

  • p2 – p1.

В результате вычисления всех выражений, исключая последнее выражение (p2 –p1), получается адрес. Результатом вычисления разностиp2 –p1 будет целое число. Рассмотрим выражениеp1++. При вычислении этого выражения следует учитывать возвращаемое значение и побочный эффект. Возращаемым значения выраженияp++ является исходное значение указателяp. Побочный эффект при вычислении выраженияp++ состоит в увеличении операнда на единицу. Однако адрес, хранящийся в указателеp, увеличивается таким образом, чтобы указатель был установлен на следующий элемент массива. При работе в 32 разрядной среды адрес, хранящийся в указатель, увеличиться на 4 байта. Таким образом, арифметические операции, выполняемые с указателями, оказываются масштабированными. В качесте масштаба используется объем памяти, которую занимает один элемент массива, с которым работает указатель.

      1. Сравнение указателей

Указатели можно сравнивать. Сравнение имеет смысл только для указателей на один и тот же массив. При соблюдении этого условия операции ==, !=, <, >, <=, >= будут выполняться корректно.

    1. Указатели и динамическая память

Как отмечалось выше, одной из основных областей применения указателей – работа с динамической памятью. Использование динамической памяти позволяет повысить эффективность использования оперативной памяти компьютера. При этом возрастают трудности программирования. В первую очередь это связано с тем, что программист должен следить за выделением и освобождением память самостоятельно.

В стандарте языка Си определены четыре функции, предназначенные для выделения и освобождения динамической памяти. К ним относятся следующие функции:

  • malloc().

  • calloc(),

  • realloc(),

  • free().

Первые три функции служат для выделения динамической памяти. Последняя функция предназначена для освобождения памяти. На начальном этапе знакомство с вопросами, связанными с работой с динамической памятью, достаточно ограничиться функциями malloc() иfree().