ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Написать программу определения адресов целых чисел от 0 до 9 и строчных букв латинского алфавита.
Пример 1. Написать программу определения адресов целых чисел от 0 до 9 и строчных букв латинского алфавита. Программный код решения примера
В программе использован спецификатор формата %5p для определения адреса переменных. Число 5 определяет отступ от левого края на пять позиций. Задание 1 1. Добавьте вывод кодов цифр и букв, для которых определены адреса в памяти компьютера. 2. В программе вместо операторов цикла for примените операторы if. 3. В программу введите указатель на тип int и примените этот указатель по аналогии с указателем *ptr2. 4. Добавьте определение адресов прописных букв латинского алфавита и выведите их дополнительным столбцом к адресам строчных букв. 5. Выведите в столбец свою фамилию (буквами латинского алфавита), имя и адреса соответствующих букв фамилии и имени. Пример 2. Написать программу однозначного задания типа разностей указателей, и определения адресов заданных указателей. Для решения данного примера подключим заголовок stddef.h для определения типа разности указателей с помощью зарезервированного имени типа ptrdiff_t. Программный код решения примера
Рис. 7.2. Адреса указателей типа int и их разность Задание 2 1. Поменяйте местами переменные х и у. Проанализируйте результат выполнения программы. 2. Для переменных произведите инициализацию в соответствии с номером компьютера, на котором выполняется лабораторная работа, и текущего дня недели. 3. Рассмотрите решение примера для следующих типов: char, long int, unsigned int, float, double, long double. 4. Вывод результатов осуществите с помощью одной функции printf(). Пример 3. Написать программу арифметических операций с указателями. При выполнении примера следует иметь в виду, что операции & и * имеют более высокий приоритет, чем обычные арифметические операции. Программный код решения примера
Рис. 7.3. Результат арифметических операций с указателями Следует обратить внимание на то, что переменные a и b сначала не были определены, а в результате приобрели некоторые значения. Задание 3 1. В программе примените типы double и float. 2. После взятия адресов от переменных a и b измените значения указателей на значения Х и 10Х, где Х – номер компьютера, на котором выполняется лабораторная работа (1, 2, ¼). Выполните указанные арифметические действия и выведите значения переменных a и b. 3. Напишите программу для выполнения операций вычитания, умножения и деления с применением указателей.
Пример 4. Написать программу двухуровневой адресации для объектов целого типа. Случай, когда указатель содержит адрес другого указателя, называется многоуровневой адресацией [4]. При двухуровневой адресации первый указатель содержит адрес второго указателя, который содержит адрес объекта с нужным значением. Объявление указателя на указатель делается с помощью двух звездочек перед именем переменной. Программный код решения примера
Результат выполнения программы представлен на рис. 7.4. Задание 4 1. Выведите на экран пользователя адреса указателей. 2. Организуйте цикл инкрементирования первого указателя, начиная с Х до 10Х, где Х – номер компьютера, на котором выполняется лабораторная работа. Сделайте вывод значений переменной, на которую дает ссылку первый указатель, и значений второго указателя. 3. Напишите программу трехуровневой адресации при задании целых чисел, равных Х и 10Х, где Х – номер компьютера, на котором выполняется лабораторная работа. Пример 5. Написать программу по определению и инициализации переменных разных типов и одного указателя типа void *. Последовательно присваивая указателю адреса переменных, вывести значения переменных с помощью разыменования указателя [5]. Программный код решения примера
Рис. 7.5. Результат настройки указателя типа void Особенностью использования указателя типа void является то, что при его разыменовании необходимо производить преобразования типов. Прежде чем произвести разыменование указателя, его приводят к указателю соответствующего типа.
Задание 5 1. В программу добавьте переменные типа float, unsigned, long и обеспечьте ввод их значений с клавиатуры. Выведите адреса и значения переменных с помощью разыменования указателя. 2. Задайте порядок (нумерованную последовательность) инициализации переменных и создайте вывод значений указателя на основе переключателя switch. Номер инициализируемой переменной задайте с клавиатуры. 3. В программу введите операцию двухуровневой адресации с применением указателя типа void. Выведите значения двух указателей с помощью их разыменования. Пример 6. Написать программу по реализации условия: определить и инициализировать переменную типа double. Определить указатели типа char**, int *, double *, void *, инициализировать их адресом переменной. Вывести на экран пользователя значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели [5]. Программный код решения примера
Рис. 7.6. Адреса и размеры указателей разных типов Как видно из полученного результата, размеры участков памяти, выделенных указателям разных типов, одинаковы. Задание 6 1. В программу добавьте вывод размера памяти для разыменованного указателя типа void. 2. Выведите значения указателей заданных типов. Определите указатель с правильным доступом к значению переменной d = 6.78. 3. Объявление указателей и взятие адреса сделайте в одной строчке для соответствующего типа. 4. В программу добавьте строки по вводу целого, вещественного типов данных, а также одиночного символа. Затем с помощью указателей выведите на консоль значения введенных данных. Пример 7. Написать программу, в которой с помощью указателя и функции scanf_s() читаются данные с клавиатуры, а также определяются и инициализируются указатели на константы и константные указатели. Программный код решения примера
В программе для получения числа p используется функция acos(0), так как косинус p /2 равен нулю. Затем полученный результат умножается на два. Дополнительная рандомизация осуществляется в цикле, одним из параметров которого является случайная функция rand(), возвращающая целое число. При этом предусмотрено приведение типов. Число х изменяется по равномерному случайному закону из интервала [- 100.0; 100.0 ]. Возможный результат выполнения программы показан на рис. 7.7.
Задание 7 1. Выполните инкрементирование указателей на константы и константных указателей. Объясните полученный результат. 2. Осуществите для программы двойной ввод с клавиатуры вещественного числа: первый раз с помощью указателя, второй – с помощью переменной. В обоих случаях выведите на печать значения указателя. 3. В качестве константы примите некоторое шестнадцатеричное число (с буквами). Определите указатель на константу и в цикле от 1 до 16 измените значение указателя с последующим выводом результатов на консоль. 4. Выполните возможные арифметические операции с константными указателями и с указателями на константы. 5. В программу введите строковую переменную, определенную через фамилию (буквами латинского алфавита) автора закона всемирного тяготения. Определите указатель на константу и выведите фамилию на консоль через указатель. Затем в цикле введите известные вам фамилии трех лауреатов нобелевской премии по литературе. Вывод результатов на консоль выполните с помощью указателя.
Контрольные вопросы 1. Каково общее назначение указателей в языке С? 2. Какие арифметические операции допускаются для указателей? 3. Какие унарные операторы используются с указателями? Как они называются? 4. Для каких типов данных может быть использован указатель? 5. Как числовые значения указателей изменяются при их инкрементировании в зависимости от типов данных. 6. С помощью какого формата осуществляется вывод на консоль адресов переменных заданного типа? 7. Что такое многоуровневая адресация? Как она организуется в языке С? 8. Как осуществляется инициализация указателей на вещественные типы данных? 9. Как осуществляется инициализация указателей на символьный тип данных? 10. Какой смысл имеет значение указателя NULL? 11. Что произойдет, если применить к указателю со значением NULL операцию разыменования? 12. Как следует определять и инициализировать указатель на константу? 13. Как следует определять и инициализировать константный указатель? 14. В чем отличие константного указателя от указателя на константу?
|