Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пару вопросов про указатели


Арлекино ©   (2015-11-26 11:39:00) 

Добрый день. Есть вопросы про указатели, которые не понимаю и не могу найти ответа. Попробую задать их здесь.

Первый:

type
PPAnsiChar = ^PAnsiChar;

var
ms, ms2: TMemoryStream;
data: PPAnsiChar;
begin
// В data содержится корректная информация
ms := TMemoryStream.Create;
ms2 := TMemoryStream.Create;

// Размер необходимой информации 32 байта
ms.WriteBuffer(data^, 32); // Получаю не то, что ожидал
ms2.WriteBuffer(data^[0], 32); // Получаю то, что ожидал

ms.SaveToFile(ExtractFilePath(Application.ExeName) + '0.txt');
ms2.SaveToFile(ExtractFilePath(Application.ExeName) + '1.txt');
end;

Разве в данном случае указатель на PAnsiChar не то же самое, что указатель на AnsiChar?

Второй:

Как будет верно перевести работающий пример с MemoryStream к варианту с использованием Move?
Ни один из ниже приведенных кодов не работает

Move(data^[0], b, 32);
Move(data^, b, 32);

Спасибо


Германн   (2015-11-29 01:21:00) [1]

Удалено модератором
Примечание: Создание пустых сообщений


Арлекино   (2015-11-28 05:07:00) [2]

Спасибо всем


DVM   (2015-11-26 20:04:00) [3]

Чтобы работал move надо внести ясность, что есть b.    

B: PAnsiChar;
....
Getmem(b, 33);
Fillchar(b^, 33, 0);
Move((data^)^, b^, 32);


Юрий Зотов   (2015-11-26 20:01:00) [4]

> "указатели на указатель" смущают и пугают.

А чего там смущаться-то?

Указатель - переменная, содержащая адрес чего-то.

Указатель на указатель - переменная, содержащая адрес указателя.

Указатель на указатель на указатель - переменная, содержащая адрес указателя на указатель.

И т.д. Ничего сложного, только при кодинге аккуратность нужна.


DVM   (2015-11-26 19:37:00) [5]


> Тогда что такое AnsiChar[0]

Это не правильная запись. В моем ответе во втором варианте ноль в квадратных скобках не нужен это опечатка.


Игорь Шевченко   (2015-11-26 18:32:00) [6]


> "указатели на указатель" смущают и пугают


Представь, что PPAnsiChar - это указатель на массив PAnsiChar


Арлекино   (2015-11-26 13:13:00) [7]

Спасибо за такие быстрые ответы


> А можно узнать, чего хочется, а не как хочется ?


Хочется вытащить необходимую информацию (знаю, как должна выглядеть) из пришедшего извне (не моего) PPAnsiChar. Документации нет, разработчик недоступен, методом тыка пытаюсь понять, как хранятся данные. Если с простыми указателями я еще худо-бедно справляюсь (опыт работы с ними практически отсутствует), то "указатели на указатель" смущают и пугают.


> DVM ©

Спасибо, ясна разница. Но конструкция


> (data^)^[0]


заставляет шевелиться волосы на голове.

data - PPAnsiChar
data^ - PAnsiChar
(data^)^ - AnsiChar

верно? Тогда что такое AnsiChar[0]?

Вопрос про Move остается, ибо эта конструкция даже не компилируется


DVM   (2015-11-26 12:15:00) [8]


> ms.WriteBuffer(data^, 32); // Получаю не то, что ожидал

Ты пишешь в поток символы, начиная с первого байта самого адреса


> ms2.WriteBuffer(data^[0], 32); // Получаю то, что ожидал

Ты пишешь в поток символы начиная с первого байта по адресу. При этом происходит неявное разыменование. На самом деле выполняется следующее:

ms2.WriteBuffer((data^)^[0], 32);


Игорь Шевченко   (2015-11-26 11:51:00) [9]

А можно узнать, чего хочется, а не как хочется ?


> Разве в данном случае указатель на PAnsiChar не то же самое,
>  что указатель на AnsiChar?


Нет, это разные типы указателей


Наверх

Титульная страница Поиск, карта сайта Написать письмо