Форум: "Начинающим";
Текущий архив: 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