Форум: "Основная";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
ВнизДрузья, подскажите для чего нужны указатели, на простом примере Найти похожие ветки
← →
Алекс555 (2002-04-03 12:37) [0](указатели с таким ^), и простой пример (4+16)*3, или цифры из Edit"ов вывод в Edit4, если это уместно. Книги читал. На практике применить не знаю как или где. Всем спасибо.
← →
Digitman (2002-04-03 13:03) [1]//объявление статических переменных
var
ptr: Pointer;
val_1: Integer; // пусть она распределена в памяти по некоему адресу 100
val_2: Integer; // 104
val_3: Integer; / 108
...
//занести в переменную указ.типа ptr фактический
//АДРЕС МЕСТОНАХОЖДЕНИЯ В ПАМЯТИ переменной val_1
//(переменной с наименьшим адресом в блоке последовательно
//следующих переменных одного и того же типа)
ptr := @Val_1;
for i:= 0 to 2 do begin
//взять из переменной ptr ее текущее значение и,
//рассматривая это значение как указатель на нечто в памяти, к чему мы хотим обратиться,
// говорим компилятору : это "нечто" есть целочисленная переменная, поэтому "не ругайся", что мы этому "нечто" присваиваем значение, равное значению переменной цикла i
Integer(ptr^) := i; // переменная ptr примет значение 100
//теперь для обращения к переменным val_2 (по адресу 104) и val_3 (по адресу 108)
//достаточно изменить содержимое переменной ptr так, чтобы при
//следующих итерациях оно указывало на соответствующие адреса этих переменных
//посему - просто увеличим значение переменной ptr
//на величину, равную размеру целочисленной переменной (4 байта)
Inc(Cardinal(p), sizeof(integer));
end;
← →
AFROLOV (2002-04-03 13:28) [2]Указатели полезны во многих ситуациях.
1. При работе с памятью.
2. При работе с большими объектами.
(Простой пример: перестановка 2 объектов, позволяет делать эту операцию очень быстро)
Type
MyRecord=record
a:integer;
b:integer;
c:real;
end;
procedure proc1();
Var
P1,P2,P3:^MyRecord;
begin
GetMem(P1,sizeOf(MyRecord));//Выделяем память под записи
GetMem(P2,sizeOf(MyRecord));
P3:=P1;
P1:=P2;//2 указателя указывают на объект 2
P2:=P3;//Теперь P1 указывает на объект 2 а P2 на объект 1
FreeMem(P1,sizeOf(MyRecord));//Удаляем записи из памяти
FreeMem(P2,sizeOf(MyRecord));
end;
Без применения указателей:
Type
MyRecord=record
a:integer;
b:integer;
c:real;
end;
procedure proc1();
Var
P1,P2,P3:^MyRecord;
begin
GetMem(P1,sizeOf(MyRecord));//Выделяем память под записи
GetMem(P2,sizeOf(MyRecord));
GetMem(P3,sizeOf(MyRecord));
P3^.a:=P1^.a;
P3^.b:=P1^.b;
P3^.c:=P1^.c;
P1^.a:=P2^.a;
P1^.b:=P2^.b;
P1^.c:=P2^.c;
P2^.a:=P3^.a;
P2^.b:=P3^.b;
P2^.c:=P3^.c;
FreeMem(P1,sizeOf(MyRecord));//Удаляем записи из памяти
FreeMem(P2,sizeOf(MyRecord));
FreeMem(P3,sizeOf(MyRecord));
end;
Приемущества указателей в данном примере следующие:
1. Более компактный код
2. Более быстрый код (вместо 9 присваиваний 3 и это на совсем небольшой записи)
3. Не требуется выделения дополнительной памяти.
4. Код с указателями при изменении типа MyRecord изменять не нужно.
← →
REA (2002-04-03 15:43) [3]Код такой:
For i := 1 To 10000 Do D[i] := 100;
вероятно (кэши там всякие) будет медленнее такого:
PD := @D[1];
For i := 1 To 10000 Do
Begin
PD^ := 100;
Inc(PD);
End;
← →
Alx2 (2002-04-03 15:52) [4]>REA (03.04.02 15:43)
Абсолютно одинаковы (на D5)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c