2к3с Языки программирования / Конспект лекций
.pdf8.Основные строковые функции.
9.Объявление многомерных массивов.
10.Инициализация многомерных массивов.
11.Двумерные массивы и строки.
ТЕМА 7. УКАЗАТЕЛИ.
Цели: изучить основные операции по работе с указателями, а также
распределение памяти по запросу во время работы программы.
Задачи:
ознакомиться с понятием, назначением и объявлением указателей;
изучить операции с указателями и присваивание значений указателям;
изучить арифметические операции с указателями;
рассмотреть способы записи имен элементов одномерного массива;
сформировать представление о динамическом распределении памяти;
изучить назначение и использование функций: malloc(), free(), calloc(), realloc().
После изучения темы Вы должны знать:
понятие, назначение и объявление указателей;
операции с указателями и присваивание значений указателям;
арифметические операции с указателями;
способы записи имен элементов одномерного массива;
динамическое распределение памяти во время работы программы;
назначение и использование функций: malloc(), free(), calloc(), realloc().
Понятие и назначение указателя. Указатель предоставляет возможность доступа к переменной, не обращаясь непосредственно к самой переменной. Он обеспечивает способ использования адресов как именованных, «символических» объектов.
Указатель (Pointer) – это переменная, в которой содержится адрес ячейки памяти, выделенной для некоторой другой переменной, точнее, для хранения значения последней. Указатель может указывать на переменную любого
основного типа – int, char, double или на составные (агрегатные) типы –
например, массивы.
Случаи, в которых уместно использование указателей:
когда необходимо, чтобы функция возвращала больше одного значения;
для более удобной передачи массивов и строк из одной функции в другую;
для упрощения работы с массивами путем перемещения указателей на массивы (или на фрагменты массивов) вместо того, чтобы перемещать сами массивы;
для выделения (распределения) памяти и последующего доступа к ней (динамическое выделение памяти).
Переменные типа указатель. Если переменную предполагается использовать как указатель, то она должна быть объявлена соответствующим образом.
Объявление указателя состоит из основного типа, символа «звездочка» и имени переменной. Общий синтаксис определения переменной типа указатель выглядит следующим образом:
тип *имя_переменной_типа_указатель;
Операции с указателями. Имеются два особых оператора, которые используются только с указателями: * и &.
Оператор & является унарным оператором и возвращает адрес памяти операнда.
Второй оператор для указателей, *, в известной степени является дополнением (в смысле формальной логики) оператора &. Он также является унарным оператором, и возвращает значение, содержащееся в ячейке памяти,
на которую указывает значение переменной типа указатель.
Оба оператора, * и &, имеют самый высокий приоритет среди прочих арифметических операторов, за исключением унарного минуса. Их приоритет равен приоритету унарного минуса.
Присваивание значений указателям. Указателям можно присваивать значения с помощью оператора &. Операция присваивания будет выглядеть следующим образом:
ptr_var = &var;
где адрес переменной var присваивается переменной ptr_var.
Выражения с использованием указателей следуют тем же правилам, что и прочие выражения языка СИ. Очень важно, чтобы указателям были присвоены значения перед их использованием; в противном случае указатели будут содержать случайные значения («мусор»), и невозможно предугадать, на какие ячейки памяти они при этом будут ссылаться.
Арифметические операции с указателями (адресная арифметика). С
указателями можно выполнять только две операции: сложение и вычитание.
Помимо операторов инкремента и декремента можно выполнять сложение и вычитание целых чисел со значениями указателей. Также запрещено сложение и вычитание чисел с плавающей точкой (float и double) с указателями.
Можно сравнивать два указателя, включая их в выражение отношения
(логическое выражение). Но это возможно только в том случае, если оба указателя ссылаются на переменные одного и того же типа.
Указатели и одномерные массивы. Имя массива в действительности является указателем на первый элемент этого массива. Адрес любого элемента массива может быть отображен двумя способами:
записью имени соответствующего элемента массива, которому предшествует символ амперсанда (&);
записью выражения, в котором значение индекса прибавляется к имени массива.
Количество ячеек памяти, связанных с элементом массива будет зависеть от типа данных, объявленного для этого массива, так же как и от архитектуры используемого компьютера. Тем не менее, программист может задать только лишь адрес первого элемента массива, которой является именем этого массива и количество элементов, следующих за первым, то есть, значение индекса.
Распределение памяти. В случае, когда массив объявлен обычным способом,
за ним жестко закрепляется некоторый участок памяти в начальной стадии выполнения программы, в то время как для массива, представленного указателем, фиксированный блок памяти не выделяется. Распределение памяти по запросу во время работы программы, называется динамическим распределением (выделением) памяти. В этом случае память для хранения информации выделяется из общего резерва (пула) свободной памяти, только в тех случаях, когда она необходима.
Функции: malloc(), free(), calloc(), realloc().
Функция malloc() является одной из наиболее часто используемых функций, которая дает получить блок из резерва свободной памяти.
Параметром функции является целое число, которое задает количество запрашиваемых байтов.
Функция free() используется для возвращения (освобождения) памяти,
после того, как работа с ней завершена и она больше не нужна.
Функция calloc() похожа на функцию malloc(), но главное ее отличие в том, что выделяемая память заполняется нулями по умолчанию. При использовании malloc() в выделяемой памяти находятся случайные значения
(часто называемые «мусором»). Для функции calloc() требуются два аргумента.
Первый аргумент – это количество переменных (элементов данных), для которых выделяется память. Второй аргумент представляет собой размер (в
байтах) каждой переменной (каждого элемента). Так же как malloc(), функция calloc() возвращает указатель типа void, если память была выделена успешно, в
противном случае она вернет null-значение.
Функция realloc() позволяет выделить дополнительное число байтов памяти. Функция имеет два аргумента. Первый является указателем на используемую память, второй – размер (в байтах) блока памяти после перераспределения памяти.
Выводы
В данной теме рассмотрены следующие вопросы: понятие и назначение указателей; объявление переменной типа указатель; операции с указателями;
присваивание значений указателям; арифметические операции с указателями;
способы записи имен элементов одномерного массива; динамическое распределение памяти; назначение и использование функций: malloc(), free(), calloc(), realloc().
Вопросы для самопроверки
1.Понятие и назначение указателей.
2.Объявление переменной типа указатель.
3.Операции с указателями.
4.Присваивание значений указателям.
5.Арифметические операции с указателями.
6.Способы записи имен элементов одномерного массива.
7.Динамическое распределение памяти.
8.Назначение и использование функций: malloc(), free(), calloc(), realloc().
