Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-46275
Зинец Виктор
2002-03-13 14:08
2002.04.15
DCOM и базы данных - как подружить?


4-46533
Tosov
2002-02-08 23:36
2002.04.15
Создание контролов


6-46473
kerrik
2002-02-01 01:11
2002.04.15
Статистика соединения интернет


1-46339
Andrey__
2002-04-03 21:08
2002.04.15
Delphi 5 --> Delphi 6. Проблема...


1-46358
iva
2002-04-04 14:04
2002.04.15
как получить позицию нового окна?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский