Лабораторная работа №9

Лабораторная работа №9.
Тема: Разработка и отладка алгоритмов и программ с использованием указателей.

 

Вы не можете скачивать файлы с нашего сервера


Цель: Приобрести навыки работы с указателями
Оснащение: IBM PC, Borland C++ 5.02

Методические указания:

Указатель — это переменная, значением которой является адрес некоторого объекта (обычно другой переменной) в памяти компьютера.
Общая форма объявления указателя следующая: 
тип *имя;

В языке С определены две операции для работы с указателями: * и &.
Оператор & — это унарный оператор, возвращающий адрес своего операнда. Например, оператор 
m = &count;
присваивает переменной m адрес переменной count.
Оператор * — это унарный оператор, возвращающий значение переменной, расположенной по указанному адресу. Например, оператор 
q = *m;
присваивает переменной q значение переменной count.

В языке С допустимы только четыре арифметические операции над указателями: инкрементирование, декрементирование, сложение с числом, вычитание. Например, следующие операции над указателями p1 и p2 допустимы:
p1++; p1--; p1+7; p1-p2;
Указатель всегда указывает на первый байт объекта. После увеличения (уменьшения) указатель ссылается на следующий объект такого же типа.

Стандартом С допускается сравнение двух указателей. Например, если объявлены два указателя р и q, то следующий оператор является правильным: 
if(p < q) printf("p ссылается на меньший адрес, чем q\n");
Как правило, сравнение указателей может оказаться полезным, только тогда, когда два указателя ссылаются на общий объект, например, на массив.

Понятия указателей и массивов тесно связаны. Рассмотрим следующий фрагмент программы: 
char str[80], *p1;
p1 = str;
Здесь p1 указывает на первый элемент массива str. Обратиться к пятому элементу массива str можно с помощью любого из двух выражений: 
str[4]
* (p1+4)
В языке С существуют два метода обращения к элементу массива: адресная арифметика и индексация массива. Рассмотрим два примера реализации одной и той же функции, выводящей строку на экран:

Пример 9.1. 
void putstr(char *s) // Индексация указателя s как массива.
{
  for(int t=0; s[t]; t++) putchar(s[t]);
}
 
void putstr(char *s) // Использование адресной арифметики
{
  while(*s) putchar(*s++);
}

Указатели используются для динамического выделения памяти компьютера для хранения данных. Основу системы динамического распределения в С составляют функции malloc() и free().Функция malloc() выделяет память, а free() — освобождает ее. В программу, использующую эти функции, должен быть включен заголовочный файл <stdlib.h>.

Прототип функции malloc:
void *malloc(количество_байтов);
Для повышения мобильности используется оператор sizeof. В следующем примере выделяется память для 50 целых:
int *p;
p = (int *) malloc(n*sizeof(int)); 
Так как функция malloc возвращает результат типа void необходимо явное преобразование типов (int *). Оператор sizeof(int) возвращает количество байтов, отводящихся на тип int то есть 4. Следовательно, предыдущая функция выделяет память для n переменных типа int или n*4 байт.

Функция free() имеет следующий прототип: 
void free(void *p)
Здесь р — указатель на участок памяти, выделенный перед этим функцией malloc(). Функцию free() ни в коем случае нельзя вызывать с неправильным аргументом, это мгновенно разрушит всю систему распределения памяти.

Можно также динамически выделить память для многомерного массива. Для этого нужно объявить указатель, определяющий все, кроме самого левого измерения массива. Пример объявления указателя на двумерный массив:
int (*p)[10];
Здесь указатель содержит двумерный динамический массив из 10 строк, в которых хранятся целые числа. Количество чисел в строке можно задавать во время выполнения программы, но количество строк должно быть фиксированным.

Задания

Задания с лабораторной работы №4 с использованием адресной арифметики и динамического распределения памяти



Обсудить на форуме

Комментарии к статье:

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

Регистрация

Реклама

Последние комментарии