Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Что значат операторы @ и ^ в Делфи?

#delphi #указатели


Что значат операторы @ и ^ ?? Так же хочется узнать, что будет в Pkts если Psh[4, 1] = ?

Blocks = 4; 
RTParts = 2; 
BlNum, ROTO: integer
mkts = array [0..3, 1..6, 1..16] of SmallInt;
msh = array[1..392] of SmallInt;
TPmkts = ^mkts;
TPmsh = ^msh;
Pkts: array[1..Blocks, 1..RTParts] of TPmkts = ( (nil, nil), (nil, nil), (nil, nil),
(nil, nil) );
Psh: array[1..Blocks, 1..RTParts] of TPmsh = ( (nil, nil), (nil, nil), (nil, nil),
(nil, nil) );

Pkts[Num, ROTO]:= @Psh[Num, ROTO]^[9];

    


Ответы

Ответ 1



Оператор @ обозначает взятие адреса переменной (получение указателя на переменную) Оператор ^ в коде обозначает разыменование указателя и получение значения переменной. Оператор ^ при объявлении типа обозначает использование указателя. Например PPoint = ^TPoint обозначает, что объект типа PPoint будет указателем на объект типа TPoint. Эти операторы дополняют друг друга. var a: integer; b: pointer; begin a := 123; // теперь b указывает на a b := @a; // приводим указатель к конкретному типу и записываем в адрес, // на который указывает b - новое значение 120 // теперь a будет 120 PInteger(b)^ := 120; end; что будет в Pkts если Psh[4, 1] = 230 ? Pkts[4, 1]:= @Psh[4, 1]^[9]; В Pkts[4,1] будет элемент со смещением 9 от Psh[4,1]. Давайте разберем по шагам, мы получаем адрес переменной Psh[4,1], тут же его разыменовываем обратно в переменную, и от этой переменной берем [9] элемент (то есть похоже что это строка или другой массив). Обратите внимание, что подобный код не скомпилируется в Делфи, т.к. не указан разыменуемый тип @Psh[4, 1].

Комментариев нет:

Отправить комментарий