Проблемы, связанные с использованием указателей
Указатели предоставляют мощь и изящность программному коду. Кроме того, они необходимы в большинстве программ. Но когда указатель содержит неправильное значение, он может вызвать наиболее трудно устранимую ошибку. Сам по себе указатель не вызывает никаких проблем. Проблемы возникают, когда выполняется какая-либо операция, использующая неправильный указатель, например, производится чтение или запись в неизвестный участок памяти. При чтении в худшем случае в результате будет прочитан «мусор». При записи можно затереть участки кода или данных. В результате этого при поиске ошибки можно найти ее совсем в другом месте. Не существует очевидного способа для разрешения проблем, связанных с указателями.
Поскольку ошибки с указателями приводят к ужасающим последствиям, то лучше этого не допускать. С этой целью здесь рассмотрены две наиболее общие ошибки.
Классическим примером ошибки с указателем является неинициализированный указатель. Например:
// программа неверна
void main (){
int x, *p;
x = 10;
*p = x;
}
Данная программа присваивает значение 10 некоторому неизвестному участку памяти. Указатель p не получал адреса памяти, которую можно использовать. Следовательно, он содержит неопределенное значение. Такого рода проблемы часто незаметны, когда программа невелика, поскольку p, скорее всего, содержит «безопасный» адрес, не принадлежащий коду, данным, стеку или операционной системе. По мере роста программы растет и вероятность того, что неправильное использование указателя испортит жизненно важную часть программы. Неожиданно программа может зависнуть. Решение таких проблем совершенно очевидно: следует убедиться, что указатель указывает на некоторую допустимую область. Хотя в таких случаях ошибки достаточно непросто обнаружить: частая инициализация указателей (или некорректная инициализация) затрудняет поиск ошибок.
Следующая типичная ошибка возникает из-за недоразумений по использованию указателя. Например, следующая программа содержит ошибку:
// программа неверна
void main (){
int x, *p;
x = 10;
p = x;
printf("%d",*p);
}
Вызов printf() не выводит значения x, которое равно 10, на экран. В результате возникает ошибка из-за неправильного оператора присваивания
p = x;
Этот оператор присваивает значение 10 указателю р, который должен содержать адрес, а не значение. Для устранения ошибки следует написать
p = &x;
Хотя С++ выдает предупреждения об ошибках в программе, они не всегда могут помочь. Данные типы ошибок могут потребовать окольных путей по их обнаружению. Поэтому следует быть внимательным. Тот факт, что указатели могут вызвать очень сложные ошибки при некорректном использовании, не имеет никакого отношения к устранению этих ошибок.
Задания
1.Напишите функцию, параметрами которой служат адреса трех переменных типа double. Функция должна возвращать адрес (значение указателя) той из переменных, адресуемых параметрами, которая имеет максимальное значение. В основной программе с помощью обращения к функции поменяйте знак значения максимальной из трех переменных. Для решения данной задачи используйте вспомогательную функцию, возвращающую адрес максимальной из переменных, адресуемых двумя параметрами-указателями.
2.Модифицируйте предыдущую программу. Введите функцию, которая возвращает адрес минимальной из четырех переменных, адресуемых ее параметрами.
3.Напишите функцию для вычисления значения многочлена Коэффициенты , аргумент и коэффициенты передавайте в функцию с помощью списка параметров изменяемой длины. В основной программе вычислите и напечатайте значения нескольких полиномов. Для вычисления полиномов используйте схему Горнера:
.
Домашние задания
1.Наберите коды программ из Примеров 1 и 2. Выполните компиляцию и запуск программ.
2.Напишите функцию, которая упорядочивает значение трех переменных, адреса которых передаются ей в качестве параметров. В основной программе продемонстрируйте применение написанной функции. Для решения данной задачи определите и используйте вспомогательную функцию, которая упорядочивает значения только двух переменных, адресуемых ее двумя аргументами.
3. Индивидуальное задание. Номер варианта определяется по журналу. Напишите функцию с переменным числом параметров в соответствии с вариантом, продемонстрировать вызов функции с различным числом параметров. Выполните вычисления для трех и десяти чисел. Решите задачу двумя способами: через передачу количества параметров как параметр функции и через использование признака конца списка параметров.
Варианты индивидуального задания
№ | Задание |
1. | Минимальный элемент в списке параметров. |
2. | Максимальный элемент в списке параметров. |
3. | Определить, каких элементов в списке параметров больше: четных или нечетных. |
4. | Среднее геометрическое элементов в списке параметров. |
5. | Среднее арифметическое элементов в списке параметров. |
6. | Количество нечетных элементов в списке параметров. |
7. | Максимальный из элементов в списке параметров, стоящих на четных местах. |
8. | Максимальный из элементов в списке параметров, стоящих на нечетных местах. |
9. | Минимальный из элементов в списке параметров, стоящих на четных местах. |
10. | Минимальный из элементов в списке параметров, стоящих на нечетных местах. |
11. | Среднее арифметическое из элементов в списке параметров, стоящих на четных местах. |
12. | Среднее арифметическое из элементов в списке параметров, стоящих на нечетных местах. |
13. | Среднее геометрическое из элементов в списке параметров, стоящих на четных местах. |
14. | Среднее геометрическое из элементов в списке параметров, стоящих на нечетных местах. |
15. | Минимальный отрицательный элемент в списке параметров. |
16. | Максимальный отрицательный элемент в списке параметров. |
17. | Минимальный положительный элемент в списке параметров. |
18. | Максимальный положительный элемент в списке параметров. |
19. | Сумму минимального и максимального элементов в списке параметров. |
20. | Сумму четных элементов в списке параметров. |
21. | Сумму нечетных элементов в списке параметров. |
22. | Разность минимального и максимального элементов в списке параметров. |
23. | Сумму элементов в списке параметров, стоящих на четных местах. |
24. | Сумму элементов в списке параметров, стоящих на нечетных местах. |
25. | Определить, каких элементов в списке параметров больше: положительных или отрицательных. |
26. | Количество четных элементов в списке параметров. |
27. | Среднее гармоническое элементов списка. |
28. | Произведение элементов списка. |
Дата добавления: 2015-02-16; просмотров: 966;