1) При работе с указателями необходимо внимательно выполнять операции увеличение и уменьшение.
Например, выражения дают различные результаты.
a) (* p) ++
б) * p ++
в) * ++ p
В первом случае увеличивается значение переменной, размещенной по указателю p.
Во втором случае извлекается значение по указателю p, а затем значение указателя p увеличивается.
В третьем случае сначала увеличивается значение указателя, а затем извлекается значение переменной размещенной по новому адресу.
При выполнении операции увеличение и уменьшение на количество байтов, занимаемое переменной, связанной с указателями.
2) Операция увеличение и уменьшение постфиксные и префиксные не могут применяться к имени массива, т.к. имя массива является константой указателя.
Применение операции увеличение или уменьшение к константам вызовет ошибку. Чтобы избежать ошибок, надо описать указатель, того же типа, что и массив и присвоить ему адрес первого элемента, т.е. имя массива.
Пример:
int a [10], * p;
a++; / * ошибка * /
p = a;
p++;
3) Определение int a [ ]; и определение int * a; эквивалентны. Оба определения говорят, что а является указателем на целое.
4) Следует различать выражения
char ( * fun ) ( );
char * fun ( );
В первом случае определяется указатель на функцию.
Второй оператор описывает функцию, возвращающую указатель на символ.
5) Классическим примером ошибки с указателем является неинициализированный указатель.
Пример:
/ * неправильная программа * /
int main (void)
{ int x, * p;
x = 10;
* p = x;
return 0;
}
Данная программа присваивает значение 10 некоторому неизвестному участку памяти.
Указатель p не получает адреса памяти, который можно использовать. Следовательно, он содержит неопределенное значение. Такого рода ошибки часто незаметны в небольших программах, но для больших программ велика вероятность зависания. Решение: Следует убедиться, что указатель указывает на некоторую допустимую область. Частая инициализация указателей или некорректная инициализация затрудняет поиск ошибок.