Опубликован: 14.12.2010 | Уровень: для всех | Доступ: свободно
Лекция 8:

Указатели в языке программирования С

< Лекция 7 || Лекция 8: 123 || Лекция 9 >

Задание 2

  1. Поменяйте местами переменные х и у. Проанализируйте результат выполнения программы.
  2. Для переменных произведите инициализацию в соответствии с номером компьютера, за которым выполняется лабораторная работа, и своего дня рождения.
  3. Рассмотрите решение примера для следующих типов: char, long int, long 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*Х, где Х – номер компьютера, за которым выполняется лабораторная работа. Выполните указанные арифметические действия и выведите значения переменных a и b.
  3. Напишите программу для выполнения операций вычитания, умножения и деления с участием указателей.
  4. Для вывода результатов примените только одну функцию printf().

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

Случай, когда указатель ссылается на указатель, который ссылается на число, называется многоуровневой адресацией [7.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 *. Последовательно присваивая указателю адреса переменных, выведите значения переменных с помощью разыменования указателя [7.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 является то, что при разыменовании указателя необходимо производить преобразования типов. Прежде чем произвести разыменование указателя, его приводят к указателю соответствующего типа.

Задание 5

  1. В программу добавьте переменные типа float, unsigned, long и обеспечьте ввод их значений с клавиатуры. Выведите адреса и значения переменных с помощью разыменования указателя.
  2. Задайте порядок (нумерованную последовательность) инициализации переменных и создайте вывод значений указателя на основе переключателя switch. Номер инициализируемой переменной задайте с клавиатуры.
  3. В программу введите операцию двухуровневой адресации с применением указателя типа void. Выведите значения двух указателей с помощью их разыменования.
< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов