Лекция 01. Тема Общая характеристика языков программирования высокого уровня


Download 4.1 Mb.
Pdf ko'rish
bet22/57
Sana12.11.2023
Hajmi4.1 Mb.
#1767546
TuriЛекция
1   ...   18   19   20   21   22   23   24   25   ...   57
Bog'liq
Lektsii po YaP Lukinova 2 sem

3.6. Указатели
Указательпеременная, значением которой может быть адрес ячейки 
памяти или особый символ 0, т.е. нулевой адрес, который используется как 
пометка того, что указатель свободен.
Указатели используются в следующих случаях:
1. Организация косвенной адресации для нединамических объектов. В 
частности, в языке С указатели широко используются при обращении к 
массивам, строкам, структурам. И это является одним из факторов 
ненадежности данного языка.
2. Для организации обращения к ячейкам динамической памяти (кучи). 
Переменные, размещенные в куче, не имеют имен, обращаться к ним можно 
только с помощью указателей и ссылок.
Как любая переменная, указатель должен иметь тип. Тип указателя 
определяет объем динамической памяти в байтах, выделяемой из кучи. 
Однако в языках существует два вида указателей:
1. Типизированные, когда тип указателя определяется типом переменной, 
на которую он будет указывать. В нижеприведенном примере все 
объявленные указатели являются типизированными. 
Пример 1.
Язык Pascal:
Язык С:
var
i,j : ^integer; char *ch;
r : ^real; int *i, *j;
ii : int; int ii;
2. Нетипизированные, тогда объем выделяемой памяти определяется с 
помощью специальных функций. Нетипизированные указатели существуют в 
языке Pascal, для их объявления задействован специальный тип pointer:
var
p : pointer;
Операции над указателями:


1. 
Инициализация указателя – присваивание указателю адреса. Может 
происходить в следующих случаях:

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

обеспечение косвенной адресации для нединамического объекта, 
например, массива:
int*(A+индекс)=*A+индекс*длина;

посредством операции взятия адреса (операция «амперсант»):
i=ⅈ
2. Разыменование указателя – взятие (присваивание) значения из/в 
ячейки, на которую указывает указатель. Если, например, указатель i 
указывает на ячейку, которая содержит число 206, то оператор 
ii = *i;
поместит это число в переменную ii, а оператор 
*i = 220;
присвоит значение 220 в динамическую переменную, адрес которой 
содержится в указателе i.
3. Освобождение динамической памяти. Освободить память означает, 
что необходимо возвратить динамическую переменную в кучу, т.е. отдать ее 
адрес в распоряжение операционной системы. Для этого существуют 
специальные функции
Dispose (i); (Pascal),
Free (i); (С).
Следует заметить, что, вообще говоря, эти функции не освобождают 
указатель, они только возвращают динамическую переменную в кучу. Для 
надежной работы программы необходимо производить и освобождение 


указателя (см. следующий пункт 4), хотя в некоторых языках операции 3 и 4 
совмещены.
4. Освобождение указателя – помещение в него нулевого адреса (на 
примере языка Pascal).
const c : pointer = NIL //нулевой адрес в Pasсal

dispose(i);
i = c;
Только после того, как в указатель занесли 0, его можно использовать для 
другого адреса.
5. Присваивание.
Операцию присваивания можно реализовывать только для однотипных 
указателей:
var
p1, p2 : ^int;
p3 : ^real;
pp : pointer;
begin p1 = p2;
p1 = p3; //ошибка, чтобы ее обойти, надо использовать 
// // указатель рр: 
//
pp=p3;
//
p1=pp;
end.
5. Арифметические операции над указателями (осуществляются в 
адресном пространстве):

операция “+”:
int *p1; 
// длина int равна 4-м байтам
p1 = 2000;
p1 = p1+3 //оператор поместит в р1 адрес 2012

операция “-” :


int *p1, *p2, a;
a = p2 - p1; //смещение р2 относительно р1
6. Операции отношений: >, <, =, <=, >=.
7. Операция идентификация поля записи:
p1 : ^record; //указатель на запись
p1^ . fio;
*p1.fio;

Download 4.1 Mb.

Do'stlaringiz bilan baham:
1   ...   18   19   20   21   22   23   24   25   ...   57




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling