В известном смысле недостатки любого произведения сводятся к одному - оно слишком длинно.
Вовенарг. Размышления и максимы. Дополнения
Вначале заметим, что ни один "правильный" указатель не может иметь значения 0, поэтому равенство нулю значения указателя может служить сигналом о ненормальном завершении выполнения функции.
Допустимы:
· присваивание значения указателя другому указателю того же типа;
· "операция" инициализации указателя. "Операторы":
char a;
char *pa=&a;
описывают символьную переменную a и указатель pa на объект типа char, а также инициализируют pa так, чтобы он указывал на a;
· операция вычитания указателей одного и того же типа;
· операции сложения и вычитания указателя и целого. Приведем несколько примеров:
1) пусть p - указатель на объект любого типа. Тогда оператор p++; увеличивает p так, что он указывает на следующий объект того же типа;
2) пусть i - переменная целого типа. Оператор p += i; увеличивает указатель p так, чтобы он указывал на объект, отстоящий на i "единиц" памяти, занимаемых объектом данного типа, от объекта, на который указывает p;
· Операции сравнения указателей одного и того же типа. Если p и q - указатели на объекты одного типа, то к ним применимы операции отношения (<, >=, >, <=, !=, ==). Например:
1) отношение p!=q истинно, если p и q указывают на разные объекты;
2) отношение p==q истинно, если p и q указывают на один и тот же объект;
3) отношение p!=NULL истинно, если указатель p отличен от NULL;
· Присваивание указателю нуля (NULL) и сравнение указателя с нулем (NULL).
Ниже мы будем часто пользоваться следующими стандартными операциями, используемыми для выделения и освобождения блоков памяти.