Sign in Join
Wiki copytemporary

Nil/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Nil/ru

OldNewLine
1+[[Reserved word/ru|Зарезервированное слово]] `nil` представляет собой специальное [[Constant/ru|значение]] [[Variable|переменной]]-указателя, не указывающей ни на что конкретное. В [[FPC/ru|FPC]] это реализовано как `pointer(0)` (числовое значение `0`), однако программист не должен использовать этот факт. На других языках программирования, например на C, кто-то пишет `null`. Термины “null pointer” или “nil pointer” используются взаимозаменяемо, даже среди программистов на Паскале.
2+
3+Есть два популярных объяснения этимологии `nil`. Кто-то говорит: `nil` означает латинское слово «nihil», означающее «ничего». Другой предполагает, что `NIL` - это английская аббревиатура, обозначающая “not in list” (нет в списке). Может быть, поскольку немецкое слово «Null» обозначает цифру «ноль», чтобы избежать путаницы или для различия между понятием и значением, было выбрано слово `nil`. Во всяком случае, это не имеет никакой разницы при программировании.
4+
5+## Совместимость присвоения
6+
7+`nil` can be of course [[Becomes|assigned]] to a [[Pointer|pointer]] variable, but also to other types, which are in fact pointers, but their usage is more convenient. For instance [[Dynamic array|dynamic arrays]] or [[Class|classes]]:
8+
9+Конечно, `nil` может быть [[Becomes/ru|присвоен]] переменной [[Pointer/ru|pointer]], но также и другим типам, которые на самом деле являются указателями, но их использование более удобно. Например, [[Dynamic array/ru|динамические массивы]] или [[Class/ru|классы]]:
10+
11+``` pascal
12+program nilDemo(input, output, stderr);
13+var
14+ loc: pointer;
15+ chk: array of boolean;
16+ msg: PChar;
17+ prc: TProcedure;
18+ obj: TObject;
19+begin
20+ // указываем в никуда
21+ loc := nil;
22+ // очищаем динамический массив
23+ chk := nil;
24+ // очищаем строку
25+ msg := nil;
26+ // процедурная переменная не ссылается ни на одну процедуру
27+ prc := nil;
28+ // теряем ссылку на объект
29+ obj := nil;
30+end.
31+```
32+
33+Обратите внимание, что присвоение `nil` динамическому массиву практически эквивалентно вызову процедуры `setLength(dynamicArrayVariable, 0)`. Значения массива теряются, если счетчик ссылок `dynamicArrayVariable` достигает нуля. Однако не существует сопоставимого механизма для других типов, например, присвоение `nil` переменной `class`'а или `pointer` *не* освободит (т.е. де-аллокирует) память, которая, возможно, была занята ссылочной структурой.
34+
35+## Приложение
36+
37+В манере Паскаля вы обычно не пишете такие выражения, как `pointerVariable = nil`, а используете более толковые идентификаторы. Шаблон [[Assigned|system.assigned]] заменяется точно таким же выражением, но скрывает тот факт, что переменная (*реализована* как) указатель. Поэтому его использование не является обязательным.
38+
39+Шаблон [[FreeAndNil|SysUtils.FreeAndNil]] будет вызывать шаблон класса `free` и присваивать `nil` передаваемому указателю (переменной типа `class`). Хотя это хорошая идея, очистить указатели, которые больше не указывают на допустимые объекты, это может усложнить отладку, так как нет доступного указателя, указывающего на адрес, которым был определенный объект.
40+
41+## См.также
42+
43+- [[^/ru|Оператор разыменования указателя ^]]
44+- Переменная [`system.returnNilIfGrowHeapFails`](https://www.freepascal.org/docs-html/rtl/system/returnnilifgrowheapfails.html)
45+- `{$objectChecks on}`
46+- [[Nullable types|Обнуляемые типы]]
47+
48+---
49+*From the Free Pascal wiki, page "Nil/ru", as it stood on 2022-08-06 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
50+Category: Code

Back to history