Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Вниз

Подскажите хорошую книгу по работе с указателями   Найти похожие ветки 

 
Галинка ©   (2006-04-15 01:17) [0]

Собственно сабж. Пытаюсь разобраться, но не очень получается. (((


 
Gero ©   (2006-04-15 01:20) [1]

Вряд ли существует книга по работе с указателями.


 
DevilDevil ©   (2006-04-15 01:44) [2]

Нет такой книги, потому что тема на одну главу.

Короче у тебя в компе есть оперативная память. Её можно изменять, заносить чё-либо туда, брать данные. Указатели применяются в тех программах, где происходит работа с самой памятью.
Скажи, какая у тебя задача, я постараюсь помочь!

Ну так вот. Ты можешь захватить памяти столько сколько тебе нужно:
var P : pointer;
begin
GetMem(P, 1024); // захватил 1 кб памяти
...
FreeMem(P);// Обязательно делай
end;


Существуют и другие способы захвата/освобождения памяти, это - самый простой. Если тебе надо занести допустим значение переменной типа Integer в эту память, начиная например с 1000го байта, то сделать это можно так:
var I : integer;
...
PInteger(dword(P) + 1000)^ := I; // вот такай конструкция
...
FreeMem(P);
end;


Соответственно, прочитать:
I := PInteger(dword(P) + 1000)^;

А если байт, то:
var b : byte;
...
b := pbyte(dword(P) + 1000)^;
...
end;


Ну и так для всех типов данных. Там есть ещё несколько прибамбасов. Так что пиши, что непонимаешь


 
Галинка ©   (2006-04-15 02:07) [3]

DevilDevil ©   (15.04.06 01:44) [2]

спасибо. Благодаря Вашему примеру поняла, что было в книге написано. Я просто сейчас читаю книгу, в которой описано создание и работа с динамическими массивами, т.е. создан и описан класс динамических массивов. Так вот ьто, что вы написали, применяется там, для вставки, добавлени, удаления и замены элементов массива в форме:

System,Move((FArray + (alndex * FElementSize) )^,
                  (FArray+ (succ(alndex) * FElementSize) )^,
                  (Count - alndex) * FElementSize);


 
Gero ©   (2006-04-15 02:29) [4]

> т.е. создан и описан класс динамических массивов

Зачем класс, достаточно array of.


 
Anatoly Podgoretsky ©   (2006-04-15 12:06) [5]

Как правило вся работа ведется через указатели, просто эта работа скрыта за высокоуровневыми конструкциями.
А сама работа очень простая и понятна. Указатель указывает на объект.


 
Галинка ©   (2006-04-15 13:04) [6]

Gero ©   (15.04.06 02:29) [4]

а у array of ... тоже есть функции вставки, удаления, перестановки элементов? Просто я пользовалась ими просто как массивами переменной длины.

Анатолий, а можно про это где-то почитать? И вправду интересно...


 
Anatoly Podgoretsky ©   (2006-04-15 13:11) [7]

У array of ... нет такиъ методов, да и сложно было бы их придумать, поскольку сложность массива не ограничена, ни по глубине, ни по измерениям, ни по типам.

Почитать - это надо в основном смотреть старые книги.
Работа напрямую с указателями мало отличается от работы без них, ранее надо было указывать ^, теперь достаточно точку. Вся сложность состоит при работе с выделением памяти, что бы не испортить указатель и освободить память если она не нужна. Во времена динамических массивов подобная самодеятельность нужна весьма редко. Но и она относится не к работе с указателями, а работе с управлением памятью.


 
Галинка ©   (2006-04-15 13:38) [8]

Анатолий, просто я сейчас читаю Бакнела "Фундаментальные алгоритмы и структуры данных в Delphi". Там в разделе массивы он описывает как раз создание класса одномерного динамического массива со всеми функциями: добавление и вставка элемента, удаление элемента, поиск элемента, перестановка элементов и т.д. Неужели все это бесполезно?

Просто я очень часто пользуюсь массивами, особенно массивами из записей. Может было бы не плохо создать такой вот класс?


 
Romkin ©   (2006-04-15 13:47) [9]

Главное - понять, что такое указатели и терминологию. Вот первое, что приходит в голову:
Допустим, есть дом на сотню квартир, и есть сантехник, его обслуживающий. У сантехника есть ящик, куда можно кинуть один листочек с номером квартиры. Когда ему скучно, он открывает этот ящичек, и если в нем есть листочек с номером квартиры, он идет в эту квартиру и устраивает потоп ;)
Так вот, квартиры - ячейки памяти, сантехник процедура, его ящичек - указатель (допустим, параметр процедуры), а листочек с номером квартиры - ссылка на ячейку памяти.
То есть в псевдокоде:

type
 app = array [1..100] of word - квартиры, массив, word - просто для примера
 
procedure Устроить потоп(ящик: PWord); // сантехник, ящик - типированный указатель на квартиру.
var
 Квартира: word
begin
...
 if assigned(ящик) then
 begin
   Квартира := ящик^; //разыменовываем указатель
   Делаем потоп
 end
...
end

Вызов: Устроить потоп(@app[4]) - передаем ссылку на четвертую квартиру.
А если Устроить потоп(nil) - ничего не будет, указатель пуст.
Теперь предположим, что привезли бытовку:
var
 Бытовка: PWord; //Место куда ставить, указатель
begin
 GetMem(Бытовка, SizeOf(Word)); //привезли
 Устроить потоп(Бытовка); - НУ да, то, что и раньше
 FreeMem(Бытовка); - увезли

Вот вроде и все, что нужно понимать :)
А массив - это просто массив. Сделать с ним можно многое, иногда пишут код, который делает с этим массивом что-то определенное, и тогда вся эта конструкция называется структурой данных. Каждая такая структура данных характеризуется набором действий, которые можно сделать в ней, и асимптотикой времени выполнения каждого такого действия. У тебя, похоже, именно структура - есть доюавление элемента, удаление, перестановка...


 
Anatoly Podgoretsky ©   (2006-04-15 14:32) [10]

Галинка ©   (15.04.06 13:38) [8]
Неужели все это бесполезно?

С классом не безполезно, можно делать любую обертку, типичный представитель TList


 
Галинка ©   (2006-04-15 14:40) [11]

Anatoly Podgoretsky ©   (15.04.06 14:32) [10]

Вот и он, в смысле автор, сравнивает это все с TList... Может может кто-нибудь еще что-то пососветовать, в смысле почитать...


 
Anatoly Podgoretsky ©   (2006-04-15 14:41) [12]

Посмотреть класс модуля в исходниках.


 
TUser ©   (2006-04-16 06:09) [13]


> System,Move((FArray + (alndex * FElementSize))^,
>                   (FArray+ (succ(alndex) * FElementSize))^,
>                   (Count - alndex) * FElementSize);

Обязательно ли читать книгу, в которой используется такой код?



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
15-1144612282
SAK
2006-04-09 23:51
2006.04.30
Написание оптимального кода под Delphi


15-1144504847
kcg
2006-04-08 18:00
2006.04.30
"Сканер транслятора"


15-1144404237
BlackLumer
2006-04-07 14:03
2006.04.30
Где взять то благодаря чему


15-1144327366
Tirael
2006-04-06 16:42
2006.04.30
пассивный режим фтп


4-1139390033
plotn
2006-02-08 12:13
2006.04.30
Динамическая загрузка dll





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский