![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонимаю в чем разница (указатель на запись) [D7, XP]
gosha73 © (2006-12-18 19:31:00)Есть у меня функция, которая возвращает указатель на структуру, вот она:
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 ....
В чем подвох и почему работает при разных способах написания кода и как в данном случае правильно будет обращаться к записям структуры?
MetalFan (2006-12-19 00:28:00) [1][12] у Дж.Рихтера например http://www.natahaus.ru/2005/10/01/windows_dlya_professionalov_.html
MsGuns (2006-12-18 23:25:00) [2]Очень трудно ощутить вкус авокадо по картинке в книжке.
Читать о принципах адресации, выделении и освобождении памяти операционной системой, а заодно об управлении созданием и уничтожением объектов в Windows
Loginov Dmitry (2006-12-18 23:13:00) [3]> даже писать хорошие программы можно незная досканально тему
> указателей
Пиши, только никому про это не говори.
gosha73 (2006-12-18 21:59:00) [4]Спасибо, но читал Пачеко Ксавьера.
Там прямо заметка есть, что для начинающих понять будет совсем не просто и даже писать хорошие программы можно незная досканально тему указателей. Так что :(
Джо (2006-12-18 21:47:00) [5]> чтобы закрыть вопросы
> навсегда?
Чтобы «закрыть эти вопросы навсегда», лучше всего ознакомиться с ними в хорошей книге.
gosha73 (2006-12-18 21:44:00) [6]Спасибо.
А может еще кто ответит на [5] и [6] чтобы закрыть вопросы навсегда?
Desdechado (2006-12-18 21:00:00) [7]@Proc - в данному случае как написал Джо это взятие адреса. Так адреса или указателя? или это одно и тоже? Насколько я понимаю адрес и указатель это 4 байта на начало того места где начиаются эти данные (наверно я тут неправ).
Указатель - это переменная, место хранения адреса. Взятие адреса дает возможность поместить этот адрес в указатель. Адрес - это значение.
Pointer это некий тип данных состоящих из 4х байтов, которые в себе содержат адрес (или указатель?) на определенные данные.
Pointer - это тип данных для абстрактных указателей. Приведение типа Pointer(x) - это приказ интерпретировать содержимое X как указатель. Аналогично ведь Double(1) - приказ интерпретировать единицу ни как целое, а как дробное значение.
gosha73 (2006-12-18 20:35:00) [8]немного философии если не возражаете.
> Ega23 ©
Вопрос разницы ссылки и указателя.
Хочу понять как это происходит в самой памяти. Наверно с этого и надо начинать мне.
1. Первые 4 байта записи TMoreInfo это "адрес" верно?
2. Тогда вопрос, для PMoreInfo выделяется ли какая-либо память из 4х байтов или же это те самые начальные 4байта самой записи TMoreInfo?
3. Если пункт 1 я понимаю правильно, то наверно ссылка, это как раз вообще отдельные 4 байта в памяти, которые хранят в себе первые 4 байта TMoreInfo, а не являются частью самой TMoreInfo.
Вообщем вы видите насколько глубока чаша с кашей :)
gosha73 (2006-12-18 20:12:00) [9]Да, с указателями, адресами и ссылками у меня в голове каша уже, поскольку написание у них извращенное как мне кажется. Ссылка и указатель вроде бы одно и тоже, а может и нет, вот в этом и страх :)
> 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
Вот это самое сложное и в хелпе нигде не ищется :)
Т.е. хочу понять, что происходит когда этот символ присутствует перед и после переменных, и перед и после функций и процедур. Если вы мне это объясните, то наверно это будет полезно очень многим кодерам на дельфи, которых при виде символов ^,@ вызывает такое же выражение на лице как сами символы :)
Джо (2006-12-18 19:48:00) [10]> [2] gosha73 (18.12.06 19:43)
> А еще было бы здорово понять, почему @MoreInfo означает
> тоже самое, что PMoreInfo и компилятор при этом не ругается.
> Хотя ведь по идее PMoreInfo это указатель и правильней было
> бы написать Pointer(MoreInfo), но как раз в данном случае
> компилятор и ругается.
@ — операция взятия адреса.
Pointer() — приведение типа.
Ega23 (2006-12-18 19:48:00) [11]
> еще было бы здорово понять, почему @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 19:43:00) [12]
> Ega23 ©
Большое спасибо.
А еще было бы здорово понять, почему @MoreInfo означает тоже самое, что PMoreInfo и компилятор при этом не ругается. Хотя ведь по идее PMoreInfo это указатель и правильней было бы написать Pointer(MoreInfo), но как раз в данном случае компилятор и ругается.
Заранее благодарен.
Ega23 (2006-12-18 19:39:00) [13]Формально - GetMoreInfo^.InfoType
Но можно и GetMoreInfo.InfoType, ничего страшного в этом не будет.