|
Программирование >> Структурное программирование
strncmp strncpy strtok void * (указатель на void) арифметические операции с указателями вызов по значению вызов по ссылке выражение с указателями вычитание двух указателей вычитание целого из указателя декремент указателя длина строки добавление строки к другой строке запись указатель-смещение индексирование указателей инкремент указателя код символа константный указатель константный указатель на константные данные константный указатель на неконстантные данные копирование строк косвенная адресация косвенная ссылка на переменную лексема лингвистический процессор литеральная константа массив строк массив указателей моделируемый вызов по ссылке набор символов неконстантный указатель на константный данные неконстантный указатель на неконстантные данные неопределенная отсрочка обработка строк операция адресации (&) операция косвенной адресации (*) операция разыменования (*) представление символа численным кодом принцип наименьших привилегий присваивание указателей присваивание указателям начальных значений прямая ссылка на переменную разбиение строки на лексемы разделитель связный список символ разделитель символьная константа сложение указателя и целого смещение соединение (конкатенация) строк сравнение строк сравнение указателей строка строковая константа типы указателей указатель указатель NULL указатель на void (void *) указатель на символ указатель на функцию Типичные ошибки программирования 5.1. Операция * косвенной адресации не распространяется на все имена переменных в объявлении. Каждый указатель должен быть объявлен с помощью символа *, стоящего перед именем. 5.2. Разыменование указателя, который не был должным образом инициирован или которому не присвоено указание на конкретное место в памяти. Это может вызвать неисправимую ошибку выполнения или может неожиданно изменить важные данные и программа завершится неверными результатами. 5.3. Не разыменовывается указатель, когда это необходимо сделать, чтобы получить значение, на которое указывает этот указатель. 5.4. Отсутствие присваивания начального значения указателю, который объявлен как const, приводит к ошибке компиляции. 5.5. Пропуск скобок в операции sizeof, когда операндом является имя типа, вызывает синтаксическую ошибку. 5.6. Использование арифметических действий с указателями, не ссылающимися на элементы массива. 5.7. Вычитание или сравнение двух указателей, которые не ссылаются на элементы одного и того же массива. 5.8. Выход за пределы массива при использовании арифметических действий с указателями. 5.9. Присваивание указателя одного типа указателю другого типа (отличного от void*) вызывает синтаксическую ошибку. 5.10. Разыменование указателя на void*. 5.11. Хотя имена массивов являются указателями на их начало, а указатели в арифметических выражениях можно модифицировать, имена массивов в этих выражениях модифицировать нельзя. 5.12. Не выделяется достаточно места в массиве символов для хранения нулевого символа, завершающего строку. 5.13. Создание или использование строки , которая не содержит завершающего нулевого символа. 5.14. Обработка одного символа как строки. Строка является указателем - это может быть достаточно большое целое. А символ - это небольшое целое (диапазон значений АЗСП 0-255). Во многих системах это вызывает ошибку, потому что нижние адреса памяти зарезервированы для специальных целей, таких как обработчики прерываний операционной системы - так что происходит несанкционированный доступ . 5.15. Передача символа в качестве аргумента функции, которая ожидает строку. 5.16. Передача строки в качестве аргумента функции, которая ожидает символ. 5.17. Забывают включить заголовочный файл <string.h> при использовании функций из библиотеки обработки строк. 5.18. Не добавляется завершающий нулевой символ к первому аргументу strncpy, когда третий аргумент меньше или равен длине строки во втором аргументе. 5.19. Предположение, что stremp и strncmp возвращают 1, если их аргументы равны. При равенстве обе функции возвращают О (значение ложь в С-Ы-). Поэтому при проверке двух строк на равенство результаты функции stremp или strncmp должны для определения равенства строк сравниваться с 0. 5.20. Непонимание того, что strtok изменяет разбиваемую на лексемы строку, и последующая попытка использовать эту строку, как если бы она была исходной неизмененной строкой. Хороший стиль программирования 5.1. Хотя это и не обязательно, включайте буквы Ptr в имена переменных указателей, чтобы было ясно, что эти переменные являются указателями и требуют соответствующей обработки. 5.2. Присваивайте начальные значения указателям во избежание неожиданных результатов. 5.3. Используйте передачу по значению аргументов функции до тех пор, пока оператор вызова явно не требует, чтобы вызываемая функция модифицировала значение переменной аргумента в окружении вызывающего оператора. Это еще один пример принципа наименьших привилегий. 5.4. Прежде, чем использовать функцию, проверьте прототип функции, чтобы определить, имеет ли она возможность модифицировать передаваемые ей значения. 5.5. Используйте нотацию массивов, а не нотацию указателей при манипуляции массивами. Несмотря на то, что программа может оказаться несколько длиннее, она, вероятно, будет более понятной. 5.6. При хранении строки в массиве символов убедитесь, что массив достаточно велик, чтобы вместить наибольшую строку, которую потребуется хранить. В С++ допускается хранить строки любой длины. Если строка больше символьного массива, в котором она должна храниться, символы, выходящие за конец массива, будут изменять данные в разделах памяти, следующих за массивом. Советы по повышению эффективности 5.1. Передавайте большие объекты, такие, как структуры, используя указатели на константные данные или ссылки на константные данные, чтобы получить выигрыш по производительности, даваемый передачей по ссылке, и защиту информации, даваемую передачей по значению. 5.2. Иногда в алгоритме, который кажется естественным , могут таиться такие тонкие проблемы эффективности, как неопределенная отсрочка. Ищите алгоритмы, которые лишены проблемы неопределенной отсрочки. Замечания по мобильности 5.1. Хотя спецификация const полностью определена в С ANSI, в некоторых компиляторах она не реализована. 5.2. Количество байтов, используемое для хранения отдельных типов данных, может быть различным для разных систем. При написании программ, которые зависят от размеров типа данных и которые будут выполняться на различных компьютерных системах, используйте sizeof для определения количества байтов, применяемых для хранения различных типов данных.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |