![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатели [D7, XP]
allucard © (2007-04-24 09:11:00)Доброго дня.
Ув. мастера, прочитал тему по указателям, появилось пару вопросов, помогите разобраться:
1. Адрес чего я получаю в строке 1.
2. Адрес чего я получаю в строке 2.
3. Что я получаю в строке 7?
4. Почему компилятор пропускает строкуIntToHex(Integer(P1^),8), аIntToHex(Integer(Button1^),8)не пропускает?
ListBox1.Items.Add (IntToHex(Integer(Button1),8)); //строка 1
ListBox1.Items.Add (IntToHex(Integer(@Button1),8)); // строка 2
ListBox1.Items.Add (IntToHex(Integer((@Button1)^),8)); //строка 3
P1 := Button1;//строка 4
ListBox1.Items.Add (IntToHex(Integer(P1),8); //строка 5
ListBox1.Items.Add (IntToHex(Integer(@P1),8); //строка 6
ListBox1.Items.Add (IntToHex(Integer(P1^),8); //строка 7
Спасибо.
Сергей М. (2007-04-24 14:54:00) [1]
> можно же обмануть
Кто, кого и почему собрался "обманывать" - вот в чем вопрос)
allucard (2007-04-24 14:48:00) [2]
> clickmaker © (24.04.07 10:45) [19]
ну, можно же обмануть :)
Mikola Paganini (2007-04-24 11:02:00) [3]2 homm:
>Ты бы кстати строки то пронумеровал бы, а то строка 6 похожа на перевод строки :)
Ty slepoj???
clickmaker (2007-04-24 10:45:00) [4]
> [18] allucard (24.04.07 10:41)
ну начнем с того, что компилятор твой пример не пропустит...
и какой глубокий смысл-то в этом?
allucard (2007-04-24 10:41:00) [5]
> clickmaker © (24.04.07 10:38) [17]
ну в моём примере allucard (24.04.07 10:34) [15]
что введёшь в переменную a, введётся в переменную b?
я прав?
> Сергей М. © (24.04.07 10:37) [16]
)))
clickmaker (2007-04-24 10:38:00) [6]
> подменить адреса переменных
это ты к чему?
Сергей М. (2007-04-24 10:37:00) [7]
> можно ведь и подменить адреса переменных
С дуру можно и ... сломать)
allucard (2007-04-24 10:34:00) [8]
> clickmaker © (24.04.07 10:30) [14]
Как всё просто :о)
А можно ведь и подменить адреса переменных:)
a := 1;
b := 2;
c := @b;
@b := @a;
@a := c;
clickmaker (2007-04-24 10:30:00) [9]
> есть адрес какой-то кнопки - задача: "нажать".
TButton(Address).Click;
TEdit(Address).Text :=
allucard (2007-04-24 10:25:00) [10]
> Сергей М. © (24.04.07 10:11) [11]
Спасиб, если продолжать в таком духе, можно понять как работает компилятор :)
Что значит "работать" ?
Сформулируй конкретную задачу...
Например есть адрес какой-то кнопки - задача: "нажать".
Или есть адрес TEdit'a - ввести в его поле Caption текст.
clickmaker (2007-04-24 10:16:00) [11]
> А как с полями обьекта работать, имея только его адрес
если известны размеры полей, то по смещению
+ надо учесть выравнивание, если структура не packed
Сергей М. (2007-04-24 10:11:00) [12]
> Я получаю указатели на указатели?
Да.
> Прикольно что P1 хранятся в стековых адресах
Что ж в том "прикольного" ?
> указатель на Button1 и сам Button1 хранятся рядом 008D363C
> и 008D2128 что это за адреса?
Судя по значениям, это области памяти, распределенной динамически.
> обычные адреса хранятся в дампе 004263E8 например
А это уже область памяти, распределенная статически.
> А как с полями обьекта работать, имея только его адрес
Что значит "работать" ?
Сформулируй конкретную задачу...
allucard (2007-04-24 10:07:00) [13]
> Сергей М. © (24.04.07 09:41) [6]
P1, P2 тип Pointer;
Button1 обычная кнопка.
Сделав например так:
P1 := @Button1;
P2 := @P1;
Button := @P2;
Я получаю указатели на указатели?
Прикольно что P1 хранятся в стековых адресах 0012F624.
А указатель на Button1 и сам Button1 хранятся рядом 008D363C и 008D2128 что это за адреса?
Ведь обычные адреса хранятся в дампе 004263E8 например.
А как с полями обьекта работать, имея только его адрес,
и чтоб компилятор пропустил?)
palva (2007-04-24 09:54:00) [14]1. Адрес области, где хранятся данные объекта Button1
2. Адрес объекта Button1
3. То, на что указывает указатель P1, приведенное к типу Integer
4. Потому что P1 является указателем, а Button1 не является.
Сергей М. (2007-04-24 09:46:00) [15]Если Button1 - переменная (или поле объекта), имеющая классовый тип, то
PInteger(Button)^
homm (2007-04-24 09:43:00) [16]> 3. Почему компилятор пропускает строку (P1^), а Integer(Button1^)
> не пропускает?
Видимо потому что P1^ — указатель на данные, не имеющие типа, их можно интерпретировать как угодно, а Button1^ — указатель на экземпляр класса, иеющий свой размер, и не приводимый к 4-м байтам. вот так приводит: Integer(pointer(Button1)^) ?
Сергей М. (2007-04-24 09:41:00) [17]
> 1. Адрес чего я получаю @Button1 или @P1?
Адрес переменной (или поля объекта).
> 2. Что я получаю после:
> 3. Почему
Тип Button1 ?
allucard (2007-04-24 09:36:00) [18]Упростим вопросы:
1. Адрес чего я получаю @Button1 или @P1?
2. Что я получаю после:
P1 := Button1;
Integer(P1^)?
3. Почему компилятор пропускает строку (P1^), а Integer(Button1^) не пропускает?
P1:типа Pointer;
Спасибо.
Сергей М. (2007-04-24 09:34:00) [19]
> allucard
Типы идентификаторов Button1 и P1 ?
Это же крайне важно)
homm (2007-04-24 09:21:00) [20]Ты бы кстати строки то пронумеровал бы, а то строка 6 похожа на перевод строки :)