Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Алекс555 ©   (2002-04-03 12:37:00) 

(указатели с таким ^), и простой пример (4+16)*3, или цифры из Edit"ов вывод в Edit4, если это уместно. Книги читал. На практике применить не знаю как или где. Всем спасибо.


Alx2   (2002-04-03 15:52:00) [1]

>REA (03.04.02 15:43)

Абсолютно одинаковы (на D5)


REA   (2002-04-03 15:43:00) [2]

Код такой:

For i := 1 To 10000 Do D[i] := 100;

вероятно (кэши там всякие) будет медленнее такого:

PD := @D[1];
For i := 1 To 10000 Do
Begin
PD^ := 100;
Inc(PD);
End;


AFROLOV   (2002-04-03 13:28:00) [3]

Указатели полезны во многих ситуациях.
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 изменять не нужно.




Digitman   (2002-04-03 13:03:00) [4]

//объявление статических переменных
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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо