Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 1. Написать программу определения адресов целых чисел от 0 до 9 и строчных букв латинского алфавита.





Пример 1. Написать программу определения адресов целых чисел от 0 до 9 и строчных букв латинского алфавита.

Программный код решения примера

#include <stdio.h> #include <conio.h> int main (void) { int i, j = 0; char c = 'a', *ptr2; // Адрес символа 'a' ptr2 = &c; printf("\n\t Figures, symbols and their addresses:\n"); for (i = 0; i < 10; ++i) { printf("\n\t %3d) %2d --> %5p", i + 1, i, &i); } printf("\n"); for (; *ptr2 <= 'z'; (*ptr2)++) { printf("\n\t %3d) %2c --> %5p", ++j, *ptr2, ptr2); } printf("\n\n Press any key: "); getch(); return 0; }
 
В программе тело цикла заключено в фигурные скобки, что собственно необязательно. Но в профессиональном программировании часто так поступают. Результат выполнения программы показан на рис. 7.1.


Рис. 7.1. Вывод адресов цифр и строчных букв

В программе использован спецификатор формата %5p для определения адреса переменных. Число 5 определяет отступ от левого края на пять позиций.

Задание 1

1. Добавьте вывод кодов цифр и букв, для которых определены адреса в памяти компьютера.

2. В программе вместо операторов цикла for примените операторы if.

3. В программу введите указатель на тип int и примените этот указатель по аналогии с указателем *ptr2.

4. Добавьте определение адресов прописных букв латинского алфавита и выведите их дополнительным столбцом к адресам строчных букв.

5. Выведите в столбец свою фамилию (буквами латинского алфавита), имя и адреса соответствующих букв фамилии и имени.

Пример 2. Написать программу однозначного задания типа разностей указателей, и определения адресов заданных указателей.

Для решения данного примера подключим заголовок stddef.h для определения типа разности указателей с помощью зарезервированного имени типа ptrdiff_t.


Программный код решения примера

#include <stdio.h> #include <conio.h> #include <stddef.h> int main (void) { int x, y; int *px, *py; ptrdiff_t z; // Взятие адресов переменных px = &x; py = &y; // Разница двух указателей z = px - py; printf("\n The difference of two pointers to %p and %p is: %d", px, py, (int) z); printf("\n\n The addresses are: px = %p, py = %p\n", &px, &py); printf("\n Press any key: "); getch(); return 0; }


Результат выполнения программы представлен на рис. 7.2.

Рис. 7.2. Адреса указателей типа int и их разность

Задание 2

1. Поменяйте местами переменные х и у. Проанализируйте результат выполнения программы.

2. Для переменных произведите инициализацию в соответствии с номером компьютера, на котором выполняется лабораторная работа, и текущего дня недели.

3. Рассмотрите решение примера для следующих типов: char, long int, unsigned int, float, double, long double.

4. Вывод результатов осуществите с помощью одной функции printf().


Пример 3. Написать программу арифметических операций с указателями.

При выполнении примера следует иметь в виду, что операции &; и * имеют более высокий приоритет, чем обычные арифметические операции.

Программный код решения примера

#include <stdio.h> #include <conio.h> int main (void) { int x = 2, y = 7, a, b, *ptr, *ptr2; ptr = &a; ptr2 = &b; *ptr = x - y; *ptr2 = y - x - *ptr + 100; printf("\n\t Arithmetic operations with pointers:\n"); printf("\t a = %d, b = %d\n", a, b); printf("\n Press any key: "); getch(); return 0; }


Результат выполнения программы показан на рис. 7.3.

Рис. 7.3. Результат арифметических операций с указателями

Следует обратить внимание на то, что переменные a и b сначала не были определены, а в результате приобрели некоторые значения.

Задание 3

1. В программе примените типы double и float.

2. После взятия адресов от переменных a и b измените значения указателей на значения Х и 10Х, где Х – номер компьютера, на котором выполняется лабораторная работа (1, 2, ¼). Выполните указанные арифметические действия и выведите значения переменных a и b.

3. Напишите программу для выполнения операций вычитания, умножения и деления с применением указателей.


 

Пример 4. Написать программу двухуровневой адресации для объектов целого типа.

Случай, когда указатель содержит адрес другого указателя, называется многоуровневой адресацией [4]. При двухуровневой адресации первый указатель содержит адрес второго указателя, который содержит адрес объекта с нужным значением. Объявление указателя на указатель делается с помощью двух звездочек перед именем переменной.

Программный код решения примера

#include <stdio.h> #include <conio.h> int main (void) { int x, y = 8; int *ptr, **ptr2; x = 7; ptr = &x; ptr2 = &ptr; **ptr2 = *ptr + 10; printf("\n\t The value of x = %d. 1 st pointer is: %d. 2 nd pointer is: %d\n", x, *ptr, **ptr2); ptr = &y; ptr2 = &ptr; **ptr2 = 88; printf("\n\t The value of y = %d\n", y); printf("\n Press any key: "); getch(); return 0; }

Результат выполнения программы представлен на рис. 7.4.


Рис. 7.4. Результат двухуровневой адресации

Задание 4

1. Выведите на экран пользователя адреса указателей.

2. Организуйте цикл инкрементирования первого указателя, начиная с Х до 10Х, где Х – номер компьютера, на котором выполняется лабораторная работа. Сделайте вывод значений переменной, на которую дает ссылку первый указатель, и значений второго указателя.

3. Напишите программу трехуровневой адресации при задании целых чисел, равных Х и 10Х, где Х – номер компьютера, на котором выполняется лабораторная работа.

Пример 5. Написать программу по определению и инициализации переменных разных типов и одного указателя типа void *. Последовательно присваивая указателю адреса переменных, вывести значения переменных с помощью разыменования указателя [5].

Программный код решения примера

#include <stdio.h> #include <conio.h> int main (void){ int x = 99; double y = 6.78; char symbol = '#'; void *ptr; ptr = &x; printf("\n\t The value of variable through a pointer: %d\n", *(int *) ptr); ptr = &y; printf("\n\t The value of variable through a pointer: %lf\n", *(double *) ptr); ptr = &symbol; printf("\n\t The value of variable through a pointer: %c\n", *(char**) ptr); printf("\n Press any key: "); getch(); return 0;}


Результат выполнения программы показан на рис. 7.5.

Рис. 7.5. Результат настройки указателя типа void

Особенностью использования указателя типа void является то, что при его разыменовании необходимо производить преобразования типов. Прежде чем произвести разыменование указателя, его приводят к указателю соответствующего типа.


 

Задание 5

1. В программу добавьте переменные типа float, unsigned, long и обеспечьте ввод их значений с клавиатуры. Выведите адреса и значения переменных с помощью разыменования указателя.

2. Задайте порядок (нумерованную последовательность) инициализации переменных и создайте вывод значений указателя на основе переключателя switch. Номер инициализируемой переменной задайте с клавиатуры.

3. В программу введите операцию двухуровневой адресации с применением указателя типа void. Выведите значения двух указателей с помощью их разыменования.

Пример 6. Написать программу по реализации условия: определить и инициализировать переменную типа double. Определить указатели типа char**, int *, double *, void *, инициализировать их адресом переменной. Вывести на экран пользователя значения указателей, их размеры и длины участков памяти, которые связаны с выражениями, разыменовывающими указатели [5].

Программный код решения примера

#include <stdio.h> #include <conio.h> int main (void) { double d = 6.78; char**cp; int *ip; double *dp; void *vp; // Адресация с приведением типов cp = (char**)&d; ip = (int *)&d; dp = (double *)&d; vp = &d; printf("\n\t Address:\n\t char = %p\n\t int = %p\n\t double = %p\n\t void = %p\n", cp, ip, dp, vp); // Размеры указателей и памяти разыменованных указателей: printf("\n\t The dimension of the object type \"pointer\":\n\t char = %d\n\t int = %d\n\t double = %d\n\t void = %d\n", sizeof(cp), sizeof(ip), sizeof(dp), sizeof(vp)); printf("\n\t The size of the memory pointer:\n\t char = %d\n\t int = %d\n\t double = %d\n",sizeof(*cp),sizeof(*ip),sizeof(*dp)); printf("\n Press any key: "); getch(); return 0; }


Результат выполнения программы представлен на рис. 7.6.

Рис. 7.6. Адреса и размеры указателей разных типов

Как видно из полученного результата, размеры участков памяти, выделенных указателям разных типов, одинаковы.

Задание 6

1. В программу добавьте вывод размера памяти для разыменованного указателя типа void.

2. Выведите значения указателей заданных типов. Определите указатель с правильным доступом к значению переменной d = 6.78.

3. Объявление указателей и взятие адреса сделайте в одной строчке для соответствующего типа.

4. В программу добавьте строки по вводу целого, вещественного типов данных, а также одиночного символа. Затем с помощью указателей выведите на консоль значения введенных данных.

Пример 7. Написать программу, в которой с помощью указателя и функции scanf_s() читаются данные с клавиатуры, а также определяются и инициализируются указатели на константы и константные указатели.

Программный код решения примера

#include <stdio.h> #include <conio.h> #include <math.h> #include <stdlib.h> #include <time.h> int main (void) { double x, *px = &x, e = exp(1); const double pi = acos(0.0); // определение числа пи const double *pexp = &e; const int base = 10; const int *const pbase = &base; const double *ptr_pi = &pi; int i; time_t t; printf("\n Enter a real number: "); scanf_s("%lf", px); printf("\n The value of the entered number is \"%g\"\n", x); printf("\n The base of natural logarithms \ is \"%0.14f\"\n", *pexp); printf("\n The base of the decimal logarithm is \"%d\"\n",\ *pbase); srand((unsigned) time(&t)); // рандомизация for (i = 0; i < rand(); i++) { rand(); } // Случайное вещественное число из интервала [-100.0; 100.0] x = -100.0 + (100.0 - (-100.0))* (double)rand() / RAND_MAX; printf("\n The modified value of x: %g\n \ Pointer to the variable x: %g\n", x, *px); printf("\n The value of pi through the pointer \ and the function acos(0): %0.14f\n", *ptr_pi * 2); printf("\n\n... Press any key: "); getch(); return 0; }

В программе для получения числа p используется функция acos(0), так как косинус p /2 равен нулю. Затем полученный результат умножается на два. Дополнительная рандомизация осуществляется в цикле, одним из параметров которого является случайная функция rand(), возвращающая целое число. При этом предусмотрено приведение типов. Число х изменяется по равномерному случайному закону из интервала [- 100.0; 100.0 ].

Возможный результат выполнения программы показан на рис. 7.7.

 

 


Рис. 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. В чем отличие константного указателя от указателя на константу?

 

 







Дата добавления: 2015-09-06; просмотров: 1047. Нарушение авторских прав; Мы поможем в написании вашей работы!




Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...


Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...


Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...


Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Разновидности сальников для насосов и правильный уход за ними   Сальники, используемые в насосном оборудовании, служат для герметизации пространства образованного кожухом и рабочим валом, выходящим через корпус наружу...

Дренирование желчных протоков Показаниями к дренированию желчных протоков являются декомпрессия на фоне внутрипротоковой гипертензии, интраоперационная холангиография, контроль за динамикой восстановления пассажа желчи в 12-перстную кишку...

Деятельность сестер милосердия общин Красного Креста ярко проявилась в период Тритоны – интервалы, в которых содержится три тона. К тритонам относятся увеличенная кварта (ув.4) и уменьшенная квинта (ум.5). Их можно построить на ступенях натурального и гармонического мажора и минора.  ...

Определение трудоемкости работ и затрат машинного времени На основании ведомости объемов работ по объекту и норм времени ГЭСН составляется ведомость подсчёта трудоёмкости, затрат машинного времени, потребности в конструкциях, изделиях и материалах (табл...

Гидравлический расчёт трубопроводов Пример 3.4. Вентиляционная труба d=0,1м (100 мм) имеет длину l=100 м. Определить давление, которое должен развивать вентилятор, если расход воздуха, подаваемый по трубе, . Давление на выходе . Местных сопротивлений по пути не имеется. Температура...

Огоньки» в основной период В основной период смены могут проводиться три вида «огоньков»: «огонек-анализ», тематический «огонек» и «конфликтный» огонек...

Studopedia.info - Студопедия - 2014-2025 год . (0.011 сек.) русская версия | украинская версия