powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Функция "pointer" возвращает какую-то ерунду...
25 сообщений из 34, страница 1 из 2
Функция "pointer" возвращает какую-то ерунду...
    #39721938
Добрый день.

Изучаю указатели. Вычитал, что получить адрес первого байта данных переменной i можно разными способами, в частности, так
Код: pascal
1.
p:=@i

и так
Код: pascal
1.
p:=pointer(i)

. Если бы i была переменной типа String, то p содержала бы разные значения. Но у меня i имеет тип integer. И происходит интересная вещь.
Если я пишу
Код: pascal
1.
p:=@i

, то все работает так, как должно.
А вот если я пишу
Код: pascal
1.
p:=pointer(i)

, то начинается непонятная мне ерудна.
Функция
Код: pascal
1.
 Integer(p) 

вместо адреса первого байта переменной i возвращает значение переменной i!
А операция
Код: pascal
1.
IntToStr(pInteger(P)^)

вместо значения переменной i вообще приводит к краху программы.

В моей справке (Delphi 7) я такой функции Pointer(X) не нашел.
Гуглом получилось найти несколько примеров. Пытаюсь их повторить - у меня не работает :-(
Подскажите, пожалуйста, что за функция такая Pointer(переменная), что она возвращает, для чего нужна?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var
   i: Integer;
   p: Pointer; {нетипизированный указатель}
begin
    i := 2018;
    P := @i; {получаем указатель на первый байт четырехбайтного числа}
//P:=Pointer(i);{с этой строкой - крах. Попытка преобразовать тип P приводит к ошибке}
    Form1.Memo1.Lines.Add('Значение указателя: '+IntToStr(Integer(P)));{получаем значение указателя}
    Form1.Memo1.Lines.Add('Значение 4-х байтной переменной i, на первый байт которой указывает p: ' + IntToStr(pInteger(P)^)); {выполняем преобразование типов и разыменование}
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39721943
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федор
Код: pascal
1.
p:=pointer(i)


Это приведение типов. С тем же успехом можно написать p := TObject(i). но i от этого не станет объектом.
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39721945
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федор,

pointer(X) - ты делаешь приведение типов, а не взятие адреса.
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39721953
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федор,

странная у вас книжка, может там всё же как-то по другому написано?

вообще синоним-функция называется Addr
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39721977
DarkMaster,
всем спасибо!

А что такое приведение типов? Преобразование?

Я разбираю чужой код, где используются указатели.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
Var
   pLine:pPixelArray; {pPixelArray  - указатель на массив из RGB-триад, тысячи байтов}
   pPixel:pRGB; {указатель на тип-запись, три байта}
Begin
    pLine := Bitmap.ScanLine[0];
    pPixel := Pointer(DestLine);
End;



Я не понимаю, зачем нужна строка
Код: pascal
1.
pPixel := Pointer(pLine);


и что делает функция Pointer?

Ранее, автор кода писал так: pPixel:=pByte(pLine). Я это понимаю так. Есть типизированный указатель pLine. Он ссылается на 1-й байт огромного массива. Используя этот указатель, можно прыгать по элементам массива и полям (например, так pLine^[k].R). Но нам это неудобно. Мы хотим получить ссылку на первый байт, а потом выбирать, например, каждый 3-й байт. Тогда мы производим преобразование типов: pPixel:=pByte(pLine). pPixel - это ссылка на трехбайтный тип. Поэтому псевдофункция Inc(pPixel,1) как раз будет увеличивать значение указателя ровно на 3 байта. Правильно я понимаю?

А вот как работает Pointer(pLine) - не могу понять.
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39721980
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федор,

можешь краем глаза глянуть мои старые статьи:

http://www.makhaon.com/articles/?tag=oeacaoaee
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39721988
kealon(Ruslan)Федор_Федор,

странная у вас книжка, может там всё же как-то по другому написано?

вообще синоним-функция называется Addr

Про Addr знаю, да. Мне хочется понять, что такое Pointer(X), то эта функция возвращает...

Руслан, книжка у меня есть, В. Фаронов "Система программирования Делфи". Там нет ни слова про функцию Pointer(X).
Pointer - это зарезервированное слово для нетипизированного указателя. И все...

То же говорил встроенная справка. Но при этом компилятор Делфи не ругается на строку типа A:=Pointer(B).

Хм... Сейчас еще раз перечитал то, что удалось найти в Инете: "...Таким образом, адрес первого байта, начиная с которого расположен массив символов строки, можно получить просто прочитав числовое значение, хранящееся в S:
Pointer(S) или Integer(S). " ( http://www.cyberforum.ru/delphi/thread289886.html).

Буду думать...
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39721989
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорПро Addr знаю, да. Мне хочется понять, что такое Pointer(X), то эта функция возвращает...
Это не функция, потому ничего не возвращает.
https://ru.wikipedia.org/wiki/Приведение_типа
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39721990
makhaon,
Спасибо!
На эти не натыкался. Сейчас изучу.
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39721999
makhaon,
Изучил, спасибо.
Но про функцию Pointer(x) не нашел ничего...
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722002
wadmanФедор_ФедорПро Addr знаю, да. Мне хочется понять, что такое Pointer(X), то эта функция возвращает...
Это не функция, потому ничего не возвращает.
https://ru.wikipedia.org/wiki/Приведение_типа

А разве функция не возвращает преобразованное значение?
Я так понимаю, что функция pByte(pUntyped) возвращает указатель типа pByte с тем же значением, что у исходного нетипизированного указателя pUntyped.

Я не понимаю, что делает функция Pointer(pUntyped).
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722003
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не функция это. Это имя типа. Такое же как Integer, String, Byte, TObject, TForm, IInterface и д.р.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  S: String;
  I: Integer;
  P: Pointer;
  O: TObject;
begin
  S := 'Test';
  P := Pointer(S);
  I := Integer(P);
  O := TObject(I);
end;
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722006
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорЯ не понимаю, что делает функция Pointer(pUntyped).
Это не функция. Это приведение типов.
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722009
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, будет интересно:
Работа с указателями в Delphi
Строки и PChar
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722017
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФедорЯ не понимаю, что делает функция Pointer(pUntyped)

Любое преобразование типов (и Pointer(что-то) в том числе) не делает НИЧЕГО . Она вообще не попадает в скомпилированный машинный код. Эта конструкция лишь сообщает компилятору, что с приводимым выражением нужно обращаться как с данными иного (указанного) типа.
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722029
GunSmoker,

Спасибо!
А это вы писали?
Я читал. Не всё осилил, (в конце сложности пошли), но эти статьи - одни из лучших.
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722035
GunSmokerФедорЯ не понимаю, что делает функция Pointer(pUntyped)

Любое преобразование типов (и Pointer(что-то) в том числе) не делает НИЧЕГО . Она вообще не попадает в скомпилированный машинный код. Эта конструкция лишь сообщает компилятору, что с приводимым выражением нужно обращаться как с данными иного (указанного) типа.

Погодите, я не такой шустрый...

Итак, допустим, у меня есть переменная i типа Integer. i:=2018;
И пусть я указал в разделе var, что p:pointer. Ок.

Если я напишу вот так p:=pointer(i), то что происходит в памяти? 4 байта, которые занимала переменная i, теперь рассматриваются и как переменная i типа Integer, и как указатель p? Тогда понятно, почему Integer(p) выдает значение 2018. (Если эти 4 байта рассматриваются как указатель p, то их содержимое (число 2018) - это адрес ячейки на которую указывает указатель p).

Правильно я понимаю?
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722047
GunSmoker,

pPixel := Pointer(pLine);

pLine - это 4-байтное число, но компилятор (или кто там...) помнит, что pLine - это указатель на данные страшного размера.
pPixel - это тоже самое 4-байтное число, но компилятор помнит, что pPixel - это указатель на данные 3-байтного размера.

Получается, в моем случае, "функция-нефункция" Pointer просто убиВает скрытую информацию о типе указателя pLine и тупо подпихивает четырехбайтный адрес указателю pPixel. Коряво написал, но пока я вот так понял... Опять не то? :-)
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722051
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федор,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  i:=2018;         // в переменной i значение 2018
  p:=pointer(i);  // p указывает на адрес в памяти 2018. А что находится по этому адресу - никому неведомо
  p:=addr(i);      // p указывает на i 


var O,O2:TObject;

   p:=pointer(O);     // p указывает на обьект
   O2:=TObject(p);  // O2 теперь тоже самое, что O
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722055
DarkMasterФедор_Федор,

Код: pascal
1.
2.
3.
  i:=2018;         // в переменной i значение 2018
  p:=pointer(i);  // p указывает на адрес в памяти 2018. А что находится по этому адресу - никому неведомо
  p:=addr(i);      // p указывает на i 



Я то же самое (как мне кажется) чуть выше написал. Значит, начинаю потихоньку "врубаться".
Спасибо!
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722067
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФедорЕсли я напишу вот так p:=pointer(i), то что происходит в памяти? 4 байта, которые занимала переменная i, теперь рассматриваются и как переменная i типа Integer, и как указатель p? Тогда понятно, почему Integer(p) выдает значение 2018. (Если эти 4 байта рассматриваются как указатель p, то их содержимое (число 2018) - это адрес ячейки на которую указывает указатель p).

Правильно я понимаю?

Правильно.

ФедорpLine - это 4-байтное число, но компилятор (или кто там...) помнит, что pLine - это указатель на данные страшного размера.
pPixel - это тоже самое 4-байтное число, но компилятор помнит, что pPixel - это указатель на данные 3-байтного размера.

Получается, в моем случае, "функция-нефункция" Pointer просто убиВает скрытую информацию о типе указателя pLine и тупо подпихивает четырехбайтный адрес указателю pPixel. Коряво написал, но пока я вот так понял... Опять не то? :-)

Правильно. Только надо понимать, что вместо нетипизированного Pointer с равным успехом может стоять и типизированный PInteger, PLine, PPixel:

Код: pascal
1.
2.
3.
4.
5.
var
  S: String;
  PI: PInteger;
begin
  PI := PInteger(S); // вместо PI := Pointer(S); 


(пример практического смысла не имеет)

Ещё раз: Pointer - это просто имя типа. Такого же как Integer, PInteger, String, TObject и так далее.

Посмотрите ещё опцию "Type-checked pointers":
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Compiling
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Type-checked_pointers_(Delphi)
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Pointers_and_Pointer_Types_(Delphi)#Type-checked_Pointers
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722098
GunSmoker...
Правильно.
...
Правильно. Только надо понимать, что вместо нетипизированного Pointer с равным успехом может стоять и типизированный PInteger, PLine, PPixel:
...
Посмотрите ещё опцию "Type-checked pointers":
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Compiling
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Type-checked_pointers_(Delphi)
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Pointers_and_Pointer_Types_(Delphi)#Type-checked_Pointers


Ура. Спасибо!
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722412
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините за оффтоп....
Но автор создавал темы с 2006 года по 2018 год...
Прошло 12 лет..... Указатели... "функция" Ponter. Я что-то не догоняю?

Кстати, забавно наблюдать, что иногда на такие вопросы отправляют курить матчасть, а иногда разжевывают...
В целом радужно, когда именно разжевывают...
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722426
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite> Но автор создавал темы с 2006 года по 2018 год...
> Прошло 12 лет..... Указатели... "функция" Ponter. Я что-то не догоняю?

Скорее всего, человек просто не проф.разработчик,
а какой-то "прикладник" или теоретик - например,
ваяет "ПО" в каком-нибудь НИИ или КБ.

> Кстати, забавно наблюдать, что иногда на такие вопросы
> отправляют курить матчасть, а иногда разжевывают...
> В целом радужно, когда именно разжевывают...

Продолжайте помогать разжевывать. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Функция "pointer" возвращает какую-то ерунду...
    #39722788
GunSmoker,
Появился еще один вопрос. Теоретический.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var
i: Integer;
p: Pointer; {нетипизированный указатель}
pI:pInteger; {указатель на данные типа Integer}
begin
    i := 123;
    P := pointer(i); {указатель на первый байт четырехбайтной переменной i}
    pI:=pInteger(p);{предлагаем рассматривать указатель pI как типизированный, указывающий на данные типа Integer}
end;



Вопрос. Почему, если вместо строки "pI:pInteger;" в разделе описания переменных (Var) указать "pI:^Integer;", то компилятор ругает строку кода "pI:=pInteger(p);"
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Функция "pointer" возвращает какую-то ерунду...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]