Цель: Приобрести навыки работы с указателями.




Лабораторная работа №3_4.

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

Цель: Приобрести навыки работы с указателями.

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

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

Общая форма объявления указателя следующая:

тип *имя;

В языке С определены две операции для работы с указателями: * и &.

Оператор & — это унарный оператор, возвращающий адрес своего операнда. Например, оператор 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)

В языке С существуют два метода обращения к элементу массива: адресная арифметика и индексация массива. Рассмотрим два примера реализации одной и той же функции, выводящей строку на экран:

Пример:

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 строк, в которых хранятся целые числа. Количество чисел в строке можно задавать во время выполнения программы, но количество строк должно быть фиксированным.

Задания к лабораторной работе:

Вариант 1

1. Вставить в массив число 15 после минимального элемента.

2. Переставить первый элемент массива на место последнего При этом второй, третий,..., последний элементы сдвинуть влево на 1 позицию

3. Дан массив целых чисел Если в нем есть хотя бы одна пара соседних четных чисел, то напечатать все элементы, предшествующие элемен­там последней из таких пар.

4. Вставить в массив два заданных числа: первое после любого из мак­симальных элементов, второе — перед ним.

 

 

Вариант 2

1. Дан массив [n] поменять n и m элементы местами

2. Дан массив [n] из чётного числа элементов меняем местами первый со вторым 2 с 3 3 с 1

3. Удалить из массива min элемент.

4. Вставить в массив число 10 после каждого второго элемента.

 

Вариант 3

1. Вставить. число а в массив целых чисел после всех элементов, в кото­рых есть. цифра 5.

2. Каким должен быть максимальный рлчмер исходною массива?

3. Дан массив целых чисел. Определить, есть ли в нем хотя бы одна пара соседних нечетных чисел. В случае множительного ответа опреде­лить номера элементов первой из таких пар.

4. Вставить в массив два числа: первое со 'значением и перед всеми эле­ментами, большими п. и второе со значением т — после всех элементов. меньших т.

Каким должен быть максимальный размер исходного массива?

 

Вариант

1. Поменять местами 1-ый и минимальный элемент местами, минимальный брать последний.

2. Дано массив из четного числа элементов меняем местами максимальный и минимальный элементов массива

3. Удалить из массива последний элемент

4. Вставить заданное число перед последним четным



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: