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

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

ПРАКТИЧЕСКАЯ ЧАСТЬ. Пример 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; просмотров: 1018. Нарушение авторских прав; Мы поможем в написании вашей работы!



Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Логические цифровые микросхемы Более сложные элементы цифровой схемотехники (триггеры, мультиплексоры, декодеры и т.д.) не имеют...

ПРОФЕССИОНАЛЬНОЕ САМОВОСПИТАНИЕ И САМООБРАЗОВАНИЕ ПЕДАГОГА Воспитывать сегодня подрастающее поколение на со­временном уровне требований общества нельзя без по­стоянного обновления и обогащения своего профессио­нального педагогического потенциала...

Эффективность управления. Общие понятия о сущности и критериях эффективности. Эффективность управления – это экономическая категория, отражающая вклад управленческой деятельности в конечный результат работы организации...

Мотивационная сфера личности, ее структура. Потребности и мотивы. Потребности и мотивы, их роль в организации деятельности...

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

Признаки классификации безопасности Можно выделить следующие признаки классификации безопасности. 1. По признаку масштабности принято различать следующие относительно самостоятельные геополитические уровни и виды безопасности. 1.1. Международная безопасность (глобальная и...

Прием и регистрация больных Пути госпитализации больных в стационар могут быть различны. В цен­тральное приемное отделение больные могут быть доставлены: 1) машиной скорой медицинской помощи в случае возникновения остро­го или обострения хронического заболевания...

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