Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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)




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.023 c
1-46330           Arhangel              2002-04-03 19:53  2002.04.15  
Как поменять системную дату?


1-46303           andrew_f              2002-04-02 18:29  2002.04.15  
Internal error: U704


14-46491          rambler               2002-03-05 17:58  2002.04.15  
Вычисления.


6-46462           Anton17               2002-02-01 02:32  2002.04.15  
Тестирование сетевого приложения


3-46224           Евгений-Зеленоград    2002-03-05 23:06  2002.04.15  
Базы данных без BDE - EASY TABLE!