Nil/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Nil/ru
| Old | New | Line | |
|---|---|---|---|
| 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 |
