Форум: "Начинающим";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];
ВнизНепонимаю в чем разница (указатель на запись) Найти похожие ветки
← →
gosha73 (2006-12-18 19:31) [0]Есть у меня функция, которая возвращает указатель на структуру, вот она:
TMoreInfo = record
InfoType: Word;
Handler: LongWord;
end;
PMoreInfo = ^TMoreInfo;
....
MoreInfo: TMoreInfo;
...
function GetMoreInfo: PMoreInfo;
begin
Result := @MoreInfo;
end;
Все работает конечно же, но как правильней обращатся к членам записи MoreInfo, вот в чем вопрос. У меня работает двумя способами и это меня настараживает. Вот как я это делаю:if GetMoreInfo.InfoType = MY_INFO_TYPE then ....
if GetMoreInfo^.InfoType = MY_INFO_TYPE then ....
В чем подвох и почему работает при разных способах написания кода и как в данном случае правильно будет обращаться к записям структуры?
← →
Ega23 © (2006-12-18 19:39) [1]Формально - GetMoreInfo^.InfoType
Но можно и GetMoreInfo.InfoType, ничего страшного в этом не будет.
← →
gosha73 (2006-12-18 19:43) [2]
> Ega23 ©
Большое спасибо.
А еще было бы здорово понять, почему @MoreInfo означает тоже самое, что PMoreInfo и компилятор при этом не ругается. Хотя ведь по идее PMoreInfo это указатель и правильней было бы написать Pointer(MoreInfo), но как раз в данном случае компилятор и ругается.
Заранее благодарен.
← →
Джо © (2006-12-18 19:48) [3]> [2] gosha73 (18.12.06 19:43)
> А еще было бы здорово понять, почему @MoreInfo означает
> тоже самое, что PMoreInfo и компилятор при этом не ругается.
> Хотя ведь по идее PMoreInfo это указатель и правильней было
> бы написать Pointer(MoreInfo), но как раз в данном случае
> компилятор и ругается.
@ — операция взятия адреса.
Pointer() — приведение типа.
← →
Ega23 © (2006-12-18 19:48) [4]
> еще было бы здорово понять, почему @MoreInfo означает тоже
> самое, что PMoreInfo и компилятор при этом не ругается.
> Хотя ведь по идее PMoreInfo это указатель и правильней было
> бы написать Pointer(MoreInfo), но как раз в данном случае
> компилятор и ругается.
Так. Похоже, у тебя некая каша в голове.
Вот смотри:
type
TMoreInfo = record
InfoType: Word;
Handler: LongWord;
end;
PMoreInfo = ^TMoreInfo;
var
m : TMoreInfo;
p : PMoreInfo;
что в данном случае m и что p?
← →
gosha73 (2006-12-18 20:12) [5]Да, с указателями, адресами и ссылками у меня в голове каша уже, поскольку написание у них извращенное как мне кажется. Ссылка и указатель вроде бы одно и тоже, а может и нет, вот в этом и страх :)
> Ega23 © (18.12.06 19:48) [4]
Я так понимаю в данном случае m это сама запись, а p это указатель на эту запись. Вот боюсь я указателей :) Помогите побороть страх :). Путает меня всё это в разных случаях.
Вот к примеру привожу то, что я встречал:1. TProc = procedure of object;
Proc = TProc;
@Proc - в данному случае как написал Джо это взятие адреса. Так адреса или указателя? или это одно и тоже? Насколько я понимаю адрес и указатель это 4 байта на начало того места где начиаются эти данные (наверно я тут неправ).2. Pointer(...);
Приведение типа тоже по словам Джо. Т.е. Pointer это некий тип данных состоящих из 4х байтов, которые в себе содержат адрес (или указатель?) на определенные данные.3. PSome = ^TSome; SomeFunc^.Other = ....;
Pointer(SomeThing)^
^some
Вот это самое сложное и в хелпе нигде не ищется :)
Т.е. хочу понять, что происходит когда этот символ присутствует перед и после переменных, и перед и после функций и процедур. Если вы мне это объясните, то наверно это будет полезно очень многим кодерам на дельфи, которых при виде символов ^,@ вызывает такое же выражение на лице как сами символы :)
← →
gosha73 (2006-12-18 20:35) [6]немного философии если не возражаете.
> Ega23 ©
Вопрос разницы ссылки и указателя.
Хочу понять как это происходит в самой памяти. Наверно с этого и надо начинать мне.
1. Первые 4 байта записи TMoreInfo это "адрес" верно?
2. Тогда вопрос, для PMoreInfo выделяется ли какая-либо память из 4х байтов или же это те самые начальные 4байта самой записи TMoreInfo?
3. Если пункт 1 я понимаю правильно, то наверно ссылка, это как раз вообще отдельные 4 байта в памяти, которые хранят в себе первые 4 байта TMoreInfo, а не являются частью самой TMoreInfo.
Вообщем вы видите насколько глубока чаша с кашей :)
← →
Desdechado © (2006-12-18 21:00) [7]@Proc - в данному случае как написал Джо это взятие адреса. Так адреса или указателя? или это одно и тоже? Насколько я понимаю адрес и указатель это 4 байта на начало того места где начиаются эти данные (наверно я тут неправ).
Указатель - это переменная, место хранения адреса. Взятие адреса дает возможность поместить этот адрес в указатель. Адрес - это значение.
Pointer это некий тип данных состоящих из 4х байтов, которые в себе содержат адрес (или указатель?) на определенные данные.
Pointer - это тип данных для абстрактных указателей. Приведение типа Pointer(x) - это приказ интерпретировать содержимое X как указатель. Аналогично ведь Double(1) - приказ интерпретировать единицу ни как целое, а как дробное значение.
← →
gosha73 (2006-12-18 21:44) [8]Спасибо.
А может еще кто ответит на [5] и [6] чтобы закрыть вопросы навсегда?
← →
Джо © (2006-12-18 21:47) [9]> чтобы закрыть вопросы
> навсегда?
Чтобы «закрыть эти вопросы навсегда», лучше всего ознакомиться с ними в хорошей книге.
← →
gosha73 (2006-12-18 21:59) [10]Спасибо, но читал Пачеко Ксавьера.
Там прямо заметка есть, что для начинающих понять будет совсем не просто и даже писать хорошие программы можно незная досканально тему указателей. Так что :(
← →
Loginov Dmitry © (2006-12-18 23:13) [11]> даже писать хорошие программы можно незная досканально тему
> указателей
Пиши, только никому про это не говори.
← →
MsGuns © (2006-12-18 23:25) [12]Очень трудно ощутить вкус авокадо по картинке в книжке.
Читать о принципах адресации, выделении и освобождении памяти операционной системой, а заодно об управлении созданием и уничтожением объектов в Windows
← →
MetalFan © (2006-12-19 00:28) [13][12] у Дж.Рихтера например http://www.natahaus.ru/2005/10/01/windows_dlya_professionalov_.html
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c