Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_18-23_ПРОГР_MatiasRust_HD_CT_LE_LcMS.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
150.02 Кб
Скачать

Использование указателей при обращении к эелементам массивов

Когда объявляется массив в виде int array[25], то выделяется память не только для двадцати пяти элементов массива, но и для указателя с именем array. Его значение равно адресу первого (нулевого) элемента массива, т.е. сам массив остается безымянным, а доступ к элементам массива осуществляется через указатель с именем array.

Int array[25]; // array эквивалентно &array[0]

Для доступа к элементам массива существует два различных способа.

Первый способ: array[16] эквивалентно 16[array]

Второй способ: *(array+16) эквивалентно *(16+array)

При реализации на компьютере первый способ приводится ко второму.

Для доступа к начальному элементу массива (т.е. к элементу с нулевым индексом) можно использовать просто значение указателя array. Любое из присваиваний

*array=2; array[0]=2; *(array+0)=2;

присваивает начальному элементу массива значение 2, но быстрее всего выполнется присваиванея *array=2, так как там не требуется выполнять операции сложения.

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

Над указателями можно выполнять унарные операции: инкремент (++) и декремент (--). При этом значение указателя увеличивается или уменьшается на длину типа, на который ссылается указатель.

Значения двух указателей на одинаковые типы можно сравнивать в операциях ==, !=, <, <=",">, >=. При этом значения указателей рассматриваются просто как целые числа, а результат сравнения равен 0 (ложь) или 1 (истина).

Динамическое размещение массивов

При динамическом распределении памяти для массивов следует вначале описать соответствующий указатель. Одномерный массив a[10] из элементов типа float можно создать следующим образом

float* a; a = (float*) (calloc (10, sizeof (float) );

или a = new float[10];

Двумерный массив.

double** a; int n,m,i; ...

a= (double **) calloc (m, sizeof (double*) );

for (i=0; i<=m; i++) a[i] = (double*) calloc (n, sizeof (double) );

или a = new float[m][n];

Аналогичным образом можно распределить память и для трехмерного массива размером n,m,k. Следует только помнить, что ненужную для дальнейшего выполнения программы память следует освобождать при помощи функции free.

for (i=0; i<=m; i++) free (a[i]);

free(a);

или delete [] a; delete a;

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

В языке C все переменные и функции должны быть объявлены до их использования. Место размещения переменной в памяти программы задается с помощью класса памяти (класса хранения) переменной. В зависимости от места размещения переменной в памяти определяется время жизни и область видимости переменной. Класс памяти задается спецификатором класса памяти.

Классы памяти. В языке C имеется 4 класса памяти:

– extern (внешние переменные);

– auto (автоматические переменные);

– register (регистровые переменные);

– static (статические переменные);

Служебное слово, определяющее класс памяти, ставится в описаниях переменных перед служебным словом, задающим тип переменных:

static int i,j; extern char ch1; register int k;

Объекты класса auto имеют локальное время жизни и локальную область видимости – только ту функцию или тот блок, где они объявлены. По умолчанию, все переменные, объявленные внутри блока, относятся к классу auto. Переменная класса auto начинает существовать при входе в блок, в котором она объявлена. Память под нее выделяется в стеке. При выходе из блока переменная автоматически исчезает. При этом память, отведенная под эту переменную, освобождается.

Объекты класса register также имеют локальное время жизни и локальную область видимости, однако в отличие от авто. переменных, они размещаются на регистрах процессора, что обычно приводит к сокращению времени доступа к переменной. Если по почему-то переменная не может быть размещена на регистрах процессора, она помещается в стек. Регистровая переменная может быть только целой, и к ней нельзя применить операцию & (получение адреса).

Объекты класса static. Переменные, объявленные внутри блока как static, обеспечивают возможность сохранить значение переменной при выходе из блока и использовать его при повторном входе в блок. Статическая переменная имеет глобальное время жизни и одновременно локальную область видимости – она доступна только внутри блока, в котором объявлена. В отличие от переменных с классом auto, для переменных с классом static память выделяется в сегменте данных при объявлении переменной, и поэтому их значение сохраняется при выходе из блока.

Переменные класса памяти static могут быть инициализированы константным выражением. Если явной инициализации нет, то такой переменной присваивается нулевое значение. При инициализации константным адресным выражением можно использовать адреса любых внешних объектов, кроме адресов объектов с классом памяти auto, так как адрес последних не является константой и изменяется при каждом входе в блок. Инициализация выполняется один раз при первом входе в блок.

-- Объекты класса extern. Переменная, объявленная с классом памяти extern, является ссылкой на глобальную переменную, объявленную в одном из исходных файлов программы с тем же самым именем. Цель такого объявления состоит в том, чтобы сделать доступной переменную, созданную в другом файле. Переменные класса extern называются внешними переменными. Объявление переменной со спецификатором extern информирует компилятор о том, что память для переменной выделять не требуется, так как это уже выполнено где-то в другом месте программы. Также внешнюю переменную нельзя инициализировать, поскольку она инициализируется в другом месте.

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

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

Лексемы, операции и выражения языка Си: - арифметические, логические, поразрядные и адресные. Их синтаксис, семантика и особенности применения.