Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/92: Рейтинг темы: голосов - 92, средняя оценка - 4.87
37 / 37 / 6
Регистрация: 17.04.2011
Сообщений: 444
1

Как в делфи вывести указатель (то есть значение адреса) на экран?

06.05.2011, 12:44. Показов 17955. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как в делфи вывести указатель (то есть значение адреса) на экран? (В едит, или в сообщении). То есть как тип pointer преобразовать к текстовому?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2011, 12:44
Ответы с готовыми решениями:

Как вывести на экран переменную из функции, которой присваиваеться значение через указатель?
Только начал изучать С++. И не могу понять, как вывести на экран переменную pdLocalVar из функции...

Определить, есть ли в списке работающих Ивановы, и, если есть, то вывести их адрес (адреса)
Вот сама задача: Дан массив данных о работающих на фабрике: фамилия, имя, отчество, адрес (улица,...

как в делфи вывести в Edit после then слово 'Столбец с одинаковыми элементами есть'
как в делфи вывести в Edit после then слово 'Столбец с одинаковыми элементами есть'

Определить, есть ли в списке Петровы (Петров, Петрова), если есть, то вывести их адрес (адреса) и записать их в стек.
6. Дан список данных о работниках фирмы: фамилия, имя, отчество, адрес (улица, дом, квартира) и...

8
28 / 28 / 4
Регистрация: 28.04.2011
Сообщений: 79
06.05.2011, 13:11 2
IntToStr или IntToHex. Смотря для каких целей.
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
06.05.2011, 13:12 3
Delphi
1
2
3
4
5
6
7
var
  P : Pointer;
  S : String;
begin
  S := 'Это пример';
  P := Pointer(S);
  Edit1.Text := 'Первый символ строки расположен по адресу: ' + IntToStr( Integer(P) );
2
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
06.05.2011, 13:15 4
Ну вот пример.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.FormCreate(Sender: TObject);
var
  S:String;
  P:Pointer;
  f:^TForm;   // Указатель на объект формы
begin
  p:= Addr(self);
  f:=p;
  f.Caption := 'Test program';
  S:=Format('%p',[P]);
  Edit1.Text:=s;
end;
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
06.05.2011, 13:18 5
И ещё вот так можно:
Delphi
1
S:=Format('$%x',[ Integer(P) ]);
Вывод значения в шестнадцатиричной системе счисления.
1
37 / 37 / 6
Регистрация: 17.04.2011
Сообщений: 444
06.05.2011, 23:05  [ТС] 6
Цитата Сообщение от Mawrat Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
var
  P : Pointer;
  S : String;
begin
  S := 'Это пример';
  P := Pointer(S);
  Edit1.Text := 'Первый символ строки расположен по адресу: ' + IntToStr( Integer(P) );
Спасибо, щас так попробывал - выводит, но возник ещё один вопрос)). Значение адреса равно 4530500, а если я присваиваю
Delphi
1
p:=@s
, то выводит значение 1242664. Причём если использую типизированный указатель
Delphi
1
p:^string;
, то программа ведёт себя также: при
Delphi
1
P := Pointer(S);
выводит 4530500, при
Delphi
1
p:=@s
- выводит 1242664. Чем же операция взятия адреса @ отличается от pointer?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
06.05.2011, 23:18 7
Цитата Сообщение от Akmas Посмотреть сообщение
Чем же операция взятия адреса @ отличается от pointer?
@ возвращает адрес первого байта дескриптора строки.
Pointer возвращает адрес первого байта буфера строковых данных.

Дескриптор строки <> буфер строковых данных.
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
07.05.2011, 03:30 8
Akmas, в продолжение ответа от mss, добавлю: если объявлена переменная S : String; то S - это только указатель на область, где располагается массив символов строки. Для проверки можешь определить размер переменной S в памяти: SizeOf(S) - эта функция для любой строки вернёт значение равное 4. Таким образом, адрес первого байта, начиная с которого расположен массив символов строки, можно получить просто прочитав числовое значение, хранящееся в S:
Pointer(S) или Integer(S). Также адрес первого байта массива символов можно получить так:
@S[0] или так: Addr(S[0]) - в случае непустой строки.
А когда выполняются такие операции:
@S или Addr(S) - здесь мы получаем адрес первого (младшего) байта, начиная с которого располагается сам указатель S. Т. е. через @S, Addr(S) мы получаем указатель на указатель, который указывает на массив символов.
Строка устроена так:
Строка тип String - это указатель на ячейку (байт) в памяти, начиная с которого расположен массив символов строки. Последним символом является терминальный ноль #0 - распложен в позиции:
S[Length(S) + 1)
Кроме этого строка содержит метаданные - это сведения о размере выделенной памяти, количестве ссылок на строку и длина строки в виде количества символов (без учёта терминального нуля). Эти метаданные расположены в младших адресах перед массивом символов строки:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button1Click(Sender: TObject);
var
  P, PSize, PRefCnt, PLen : ^Integer;
  i : Integer;
  S : String;
begin
  SetLength(S, 20);
  for i := 1 to Length(S) do S[i] := '1';
  P := Pointer(S);
  PSize := Pointer( Integer(P) - 12 );
  PRefCnt := Pointer( Integer(P) - 8 );
  PLen := Pointer( Integer(P) - 4 );
  ShowMessage(
    'Строка: "' + S + '"'
    + #10 + 'Общий объём памяти (байт), выделенной для строки = ' + IntToStr(PSize^)
    + #10 + 'Длина (количество символов) без учёта терм. нуля = ' + IntToStr(PLen^)
    + #10 + 'Количество ссылок на строку = ' + IntToStr(PRefCnt^)
  );
end;
В Delphi 7 объём памяти для строки равен:
Delphi
1
2
3
4
5
6
7
8
9
10
var
  S : String;
  MemSize, AnyAdd : Integer;
begin
...
  MemSize :=
    3 * SizeOf(Integer)
    + Length(S) * SizeOf(Char)
    + 1 * SizeOf(Char)
    + AnyAdd;
AnyAdd - это некоторая величина, выбираемая менеджером памяти Delphi. Эти дополнительные байты расположены в старших адресах относительно терминального нуля.
2
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
07.05.2011, 15:15 9
Важно понимать, что в Делфи как и во многих "суперпуперпопулярных" ЯВУ (а-ля PHP, Java и иже с ними) представлено немало типов данных с так называемым "управляемым временем жизни". К ним относятся длинные строки, дин.массивы, вариантный тип и интерфейсные типы. Все они представлены в памяти указателями на дескрипторы (описатели) либо на элементы виртуальной таблицы методов (в случае интерф. типов)
1
07.05.2011, 15:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2011, 15:15
Помогаю со студенческими работами здесь

Вывести на экран количество и значение элементов в дробной части которых есть цифра 5
Дан одномерный массив А неупорядоченных действительных чисел. вывести на экран количество и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru