Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизPByteArray: непонятности Найти похожие ветки
← →
begin...end © (2004-12-31 09:35) [0]Всем здравствуйте! Вопрос навеян близлежащей веткой :-)
Вот простой пример:var
V: Cardinal;
begin
V := 1000000000; // 2-й байт: 10011010b = 154d
ShowMessage(IntToStr(PByteArray(@V)^[2])); // Конструкция 1
ShowMessage(IntToStr(PByteArray(@V)[2])); // Конструкция 2
end.
Не понятно мне вот что - по идее, конструкция 2 вообще "не должна" быть синтаксически верной, ведь PByteArray(@V) - это не массив, а только указатель на него (указатель на статический массив TByteArray), и поэтому никаких "элементов", к которым можно обращаться по индексам, у него нет! Тем не менее, результат выполнения - тот же самый, что и в случае 1.
Это - "поблажка" компилятора, или я совсем ничего не понял?
← →
Sandman25 © (2004-12-31 09:36) [1]Поблажка. Аналогично Form.Tag и Form^.Tag
← →
Digitman © (2004-12-31 09:53) [2]
> begin...end © (31.12.04 09:35)
при генерации кода компилятор одинаково интерпретирует обе конструкции, считая 2-ю кострукцию логическим аналогом 1-й .. это относится ко всем указательным типам, предназначенным для работы с областями памяти как с массивами
например,
type
arr: array[..] of Char;
parr: PChar;
chr: Char;
..
//следующие конструкции так же эквивалентны
chr := PChar(@arr)^[i];
chr := PChar(@arr)[i];
см. [1]
← →
begin...end © (2004-12-31 10:08) [3]Всем спасибо, понятно!
> [1] Sandman25 © (31.12.04 09:36)
> Аналогично Form.Tag и Form^.Tag
Form^.Tag, как раз-таки, компилятор не пропускает...
Всех - с наступающим! :-)
← →
Anatoly Podgoretsky © (2004-12-31 10:11) [4]begin...end © (31.12.04 09:35)
а только указатель на него (указатель на статический массив TByteArray), и поэтому никаких "элементов", к которым можно обращаться по индексам
Сам же говоршь - статический массив и как тогда понимать, что никаких элементов нет.
А насчет каре, оно просто не обязательно.
← →
begin...end © (2004-12-31 10:14) [5]> [4] Anatoly Podgoretsky © (31.12.04 10:11)
> Сам же говоршь - статический массив и как тогда понимать,
> что никаких элементов нет.
Говорю - указатель на статический массив :-)
> А насчет каре, оно просто не обязательно.
Да вот же ж... просто каким-то нелогичным это мне показалось :-)
Вас тоже - с наступающим! :-)
← →
Sandman25 © (2004-12-31 10:17) [6][3] begin...end © (31.12.04 10:08)
Точно. Перепутал.
← →
Anatoly Podgoretsky © (2004-12-31 10:52) [7]begin...end © (31.12.04 10:08) [3]
Для динамических структур компилятор не должен пропускать, разве что только из за внутренних ошибок. Сие документировано по крайней мере для динамических массивов.
← →
begin...end © (2004-12-31 12:13) [8]Кстати, не только с массивами такое проходит...
type
PMyRecord = ^TMyRecord;
TMyRecord = record
IntField: Integer
end;
var
pRec: PMyRecord;
begin
New(pRec);
pRec.IntField := 1;
Dispose(pRec)
end.
Всю свою сознательную жизнь жил в неведении... :-)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c