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



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

Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

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

Сущность, виды и функции маркетинга персонала Перснал-маркетинг является новым понятием. В мировой практике маркетинга и управления персоналом он выделился в отдельное направление лишь в начале 90-х гг.XX века...

Разработка товарной и ценовой стратегии фирмы на российском рынке хлебопродуктов В начале 1994 г. английская фирма МОНО совместно с бельгийской ПЮРАТОС приняла решение о начале совместного проекта на российском рынке. Эти фирмы ведут деятельность в сопредельных сферах производства хлебопродуктов. МОНО – крупнейший в Великобритании...

Что такое пропорции? Это соотношение частей целого между собой. Что может являться частями в образе или в луке...

Растягивание костей и хрящей. Данные способы применимы в случае закрытых зон роста. Врачи-хирурги выяснили...

ФАКТОРЫ, ВЛИЯЮЩИЕ НА ИЗНОС ДЕТАЛЕЙ, И МЕТОДЫ СНИЖЕНИИ СКОРОСТИ ИЗНАШИВАНИЯ Кроме названных причин разрушений и износов, знание которых можно использовать в системе технического обслуживания и ремонта машин для повышения их долговечности, немаловажное значение имеют знания о причинах разрушения деталей в результате старения...

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