Difference between revisions of "Pointer/ru"
(Created page with "{{Pointer}} Тип '''Pointer''' в Free Pascal имеет два значения: *термин или понятие для целого класса типов и пер...") |
m (Fixed syntax highlighting) |
||
(One intermediate revision by one other user not shown) | |||
Line 4: | Line 4: | ||
*термин или понятие для целого класса типов и переменных этих типов | *термин или понятие для целого класса типов и переменных этих типов | ||
*просто тип данных, который может хранить адрес переменной любого другого типа | *просто тип данных, который может хранить адрес переменной любого другого типа | ||
+ | |||
+ | __TOC__ | ||
== Общее представление == | == Общее представление == | ||
Line 10: | Line 12: | ||
Адрес переменной присваивается указателю с помощью оператора '''[[@/ru|@]]'''. Выделение памяти и присваивание адреса для значения/объекта, размещенного в куче осуществляется с помощью процедуры '''New'''. Чтение и запись данных по указателю, "ссылающегося на" переменную, возможно с помощью оператора разыменования '''^''', который записывается сразу после указателя. | Адрес переменной присваивается указателю с помощью оператора '''[[@/ru|@]]'''. Выделение памяти и присваивание адреса для значения/объекта, размещенного в куче осуществляется с помощью процедуры '''New'''. Чтение и запись данных по указателю, "ссылающегося на" переменную, возможно с помощью оператора разыменования '''^''', который записывается сразу после указателя. | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
program test_pointer_wiki2; | program test_pointer_wiki2; | ||
{$TYPEDADDRESS ON} | {$TYPEDADDRESS ON} | ||
Line 34: | Line 36: | ||
Тип данных '''Pointer''' - это просто тип, который может содержать адрес переменной или значения '''любого''' типа данных. В этом заключается противоположность между указателями типа Pointer и типизированными указателями на переменные (например указатели типа PInteger), которые могут ссылаться только на переменные или значения конкретных типов при использовании директивы компилятора {$TYPEDADDRESS ON}. Например: | Тип данных '''Pointer''' - это просто тип, который может содержать адрес переменной или значения '''любого''' типа данных. В этом заключается противоположность между указателями типа Pointer и типизированными указателями на переменные (например указатели типа PInteger), которые могут ссылаться только на переменные или значения конкретных типов при использовании директивы компилятора {$TYPEDADDRESS ON}. Например: | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
{$TYPEDADRESS ON} | {$TYPEDADRESS ON} | ||
Var | Var | ||
Line 54: | Line 56: | ||
Например: | Например: | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
Var | Var | ||
a : Integer = 20; | a : Integer = 20; | ||
Line 70: | Line 72: | ||
== Предопределенные типы указателей == | == Предопределенные типы указателей == | ||
В [[System unit/ru|модуле System]] стандартной [[RTL/ru|библиотеки RTL]] объявлен ряд указателей для встроенных типов переменных, включающий следующие типы: | В [[System unit/ru|модуле System]] стандартной [[RTL/ru|библиотеки RTL]] объявлен ряд указателей для встроенных типов переменных, включающий следующие типы: | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang=pascal> |
PSmallInt = ^Smallint; | PSmallInt = ^Smallint; | ||
PShortInt = ^Shortint; | PShortInt = ^Shortint; |
Latest revision as of 08:19, 23 February 2020
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
русский (ru) │
Тип Pointer в Free Pascal имеет два значения:
- термин или понятие для целого класса типов и переменных этих типов
- просто тип данных, который может хранить адрес переменной любого другого типа
Общее представление
Pointer представляет собой переменную, которая содержит адрес памяти локальной или глобальной переменной, а также адрес памяти сложного объекта, который был создан и сохранен в области динамической памяти программы, называемой "куча". Можно сказать, что это ссылка на значение/переменную или "указатель на" значение/переменную. Для некоторых типов данных указатель может быть объявлен с помощью оператора ^ перед названием этого типа. С помощью установки рекомендуемой директивы компилятора {$TYPEDADDRESS ON} указатели могут хранить адреса переменных или значений только тех типов данных, на которые они были объявлены.
Адрес переменной присваивается указателю с помощью оператора @. Выделение памяти и присваивание адреса для значения/объекта, размещенного в куче осуществляется с помощью процедуры New. Чтение и запись данных по указателю, "ссылающегося на" переменную, возможно с помощью оператора разыменования ^, который записывается сразу после указателя.
program test_pointer_wiki2;
{$TYPEDADDRESS ON}
var
a : Integer = 100;
b : Real = 10.5;
ptrToInt : PInteger; // PInteger - указатель на целое, объявленный в библиотеке RTL,
// который может ссылаться только на значение/переменную типа Integer
ptrToInt2 : ^Integer; // общий вид объявления указателя
begin
//ptrToInt := @b; // возникнет ошибка компиляции с установленной директивой {$TYPEDADDRESS ON}
ptrToInt := @a;
//Writeln(ptrToInt); // компилятор выдаст ошибку: Error: Can't read or write variables of this type
Writeln(ptrToInt^); // выведет 100
New(ptrToInt2); // выделение памяти в куче для типа Integer
Writeln(ptrToInt2^); // выведет случайное целое число
ptrToInt2^ := 222; // присваивание значения выделенной памяти целого типа
Writeln(ptrToInt2^) // выведет 222
end.
Тип данных
Тип данных Pointer - это просто тип, который может содержать адрес переменной или значения любого типа данных. В этом заключается противоположность между указателями типа Pointer и типизированными указателями на переменные (например указатели типа PInteger), которые могут ссылаться только на переменные или значения конкретных типов при использовании директивы компилятора {$TYPEDADDRESS ON}. Например:
{$TYPEDADRESS ON}
Var
a : Integer = 20;
b : Real = 20.5;
c : Boolean = true;
ptr : Pointer;
begin
ptr := @a; // корректное хранение адреса переменной типа Integer
ptr := @b; // корректное хранение адреса переменной типа Real
ptr := @c // корректное хранение адреса переменной типа Boolean
end.
Но, прежде чем использовать переменную типа Pointer она должна быть
- приведена к типу значения или переменной, на которую она ссылается
- разыменована с помощью оператора ^
Например:
Var
a : Integer = 20;
ptr : Pointer;
begin
ptr := @a; // корректное хранение адреса переменной типа Integer
//Writeln(ptr); // некорректно - не будет скомпилировано
// Error: Can't read or write variables of this type
//Writeln( ptr^); // Error: Can't read or write variables of this type
// Недостаточно просто разыменовать переменную типа Pointer
Writeln( PInteger(ptr)^); // После приведения типа и разыменования указателя: выведет 20
end.
Предопределенные типы указателей
В модуле System стандартной библиотеки RTL объявлен ряд указателей для встроенных типов переменных, включающий следующие типы:
PSmallInt = ^Smallint;
PShortInt = ^Shortint;
PInteger = ^Integer;
PByte = ^Byte;
PWord = ^word;
PDWord = ^DWord;
PLongWord = ^LongWord;
PLongint = ^Longint;
PCardinal = ^Cardinal;
PQWord = ^QWord;
PBoolean = ^Boolean;
См. также:
Типы данных | |
---|---|
Простые типы | Boolean | Byte | Cardinal | Char | Currency | Extended | Int64 | Integer | Longint | Pointer | Real | Shortint | Smallint | Word |
Сложные типы | Array | Class | Record | Set | String | Shortstring |