![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 06.09.2011
Сообщений: 5
|
![]()
Друзья, пытаюсь разобраться с указателями и не могу понять пару моментов.
Есть пример: program InterpretMem; {$APPTYPE CONSOLE} var 1) PI: PInteger; 2) PC: PAnsiChar; begin 3) New(PI); 4) PI^ := $006D654D; // Байты $4D $65 $6D $00 5) PC := PAnsiChar(PI); // Теперь оба указателя указывают на одно место в памяти 6) Writeln(PI^); // Печатаем число. 7) Writeln(PC^); // Печатаем один символ ($4D). 8) Writeln(PC); // Печатаем строку в стиле C (байты $4D $65 $6D $00 интерпретируются как PChar) Dispose(PI); Readln; end. вопрос 1. Мы объявили два указателя. Потом говорим в 5) PC := PAnsiChar(PI), что в моем понимании означает присваивание PC адреса того же участка памяти, куда указывает PI. Только PC указывает на символьные данные, а PI на целочисленные. Не могу понять совершенно строчку 8, ведь по идее в PC находится только адрес участка памяти, почему выводится Mem? Мы же должны разименовать PC, чтобы получить значение по этому адресу, но даже сделав это в 7) мы получим только вывод 'М'. Почему выводится значение, если вроде как по логике должен быть максимум адрес? вопрос 2. строка: PC: PAnsiChar, ведь это же равносильно PC: ^AnsiChar? Почему тогда возникает ошибка если везде заменить PAnsiChar на ^AnsiChar? |
![]() |
![]() |
![]() |
#2 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
Цитата:
I'm learning to live...
|
||
![]() |
![]() |
![]() |
#3 |
Регистрация: 06.09.2011
Сообщений: 5
|
![]()
вот какие ошибки компилятора возникают
var PI: PInteger; PC:^AnsiChar; begin New(PI); PI^ := $006D654D; // Байты $4D $65 $6D $00 PC := ^AnsiChar(PI); // [dcc32 Error] Project1.dpr(16): E2010 Incompatible types: 'Pointer' and 'Char' Writeln(PI^); // Печатаем число. Writeln(PC^); // Печатаем один символ ($4D). Writeln(PC); // [dcc32 Error] Project1.dpr(19): E2054 Illegal type in Write/Writeln statement Dispose(PI); |
![]() |
![]() |
![]() |
#4 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
Приведение типа по другому нужно делать: PC:=PAnsichar(pi) Только это глупо, потому как типы разные. Цитата:
I'm learning to live...
|
||
![]() |
![]() |
![]() |
#5 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
Если надо напечатать адрес, куда указывает данный указатель, то можно так Writeln(Integer(PC)); если особо хочется, то ещё и отформатировать в хекс-число
|
![]() |
![]() |
![]() |
#6 | |
Регистрация: 06.09.2011
Сообщений: 5
|
![]() Цитата:
var PI: PInteger; PC: ^AnsiChar;// изменил PC:PAnsiChar begin New(PI); PI^ := $006D654D; // Байты $4D $65 $6D $00 PC := PAnsiChar(PI);//[dcc32 Error] Project1.dpr(16): E2010 Incompatible types: 'Pointer' and 'PAnsiChar' phomm, увидел мой немой вопрос ![]() |
|
![]() |
![]() |
![]() |
#7 | |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
![]() Цитата:
если хотите получить значение указателя, то можно попробовать так: Код:
Правильно поставленная задача - три четверти решения.
Последний раз редактировалось DiemonStar; 04.07.2013 в 11:50. |
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Пример работы с потоками, не могу разобраться! | Kaaatso | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 27.05.2012 07:36 |
Пример работы в stl со строками | ArniLand | Общие вопросы C/C++ | 2 | 30.06.2011 08:49 |
Пример работы с TThread | Shouldercannon | Общие вопросы Delphi | 2 | 12.07.2010 16:47 |
Объясните пример работы с файлами. | spamer | Общие вопросы C/C++ | 6 | 04.06.2009 01:55 |