Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.15;
Скачать: CL | DM;

Вниз

Друзья, подскажите для чего нужны указатели, на простом примере   Найти похожие ветки 

 
Алекс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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
3-46237
UncleRu
2002-03-16 19:17
2002.04.15
кэширование данных связанных таблиц


3-46225
tima_binsprog
2002-03-23 20:16
2002.04.15
Getting username using TDatabase


1-46410
Bilya
2002-04-02 13:41
2002.04.15
Список импортируемых функций!!!!


1-46450
AFROLOV
2002-04-03 11:21
2002.04.15
Resize форм


3-46259
MixVictor
2002-03-25 20:37
2002.04.15
Бд на машине без Delphi