Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

С++ ЕНФ / мои отчёты / Отчёт по Лабе №5

.doc
Скачиваний:
18
Добавлен:
25.05.2014
Размер:
54.78 Кб
Скачать

Министерство науки и образования Российской Федерации

Уфимский государственный авиационный технический университет

Кафедра ВВТиС

ОТЧЕТ

по лабораторной работе №5

Указатели в С++

Выполнил: студент гр. ПМ-125

Марьин Д.Ф.

Проверил: ст. преподаватель каф. ВВТиС

Насибуллаева Э.Ш.

Уфа 2005

Цель работы

  • Научиться использовать указатели в программах работы с массивами и программах использующих частое обращение к каким либо строковым и др. элементам программы

  • Создать первый пример программы оформленной в виде меню

  • Научиться работать с потоками ввода/вывода

Задание к лабораторной работе № 5

1. Написать программу, меняющую местами минимальный и первый элементы в массиве. При вводе/выводе элементов использовать индексы, а обработку элементов массива осуществлять с помощью указателей. Расчет производится в функции, в которую массив передается по указателю.

2. Написать программу работы с 2-мя 3-хмерными векторами. Программа должна управляться с помощью меню, состоящего из 6 пунктов:

1) Задача

2) Ввод данных

3) Расчет скалярного произведения

4) Расчет векторного произведения

5) Расчет суммы и разности

6) Выход

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

Во всех программах должна быть предусмотрена защита ввода данных.

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

1.1.Указатели

1.1.1.Определение

Любая переменная является только именем, которое компилятор С++ ассоциирует с определенным адресом памяти компьютера.

Таким образом, у переменной помимо имени есть еще адрес и есть содержимое этого адреса.

Для компьютера все, что находится в памяти, является просто данными - идет ли речь об адресе или о содержимом переменной. Это означает, что адрес переменной можно рассматривать как новый вид данных: извлекать его из памяти, манипулировать им и сохранять результат этой манипуляции. Именно такой тип данных определен в языке С ++и носит название указателя.

Указатель - это переменная, которая содержит адрес памяти другой переменной, точнее адрес первого байта занимаемого этой переменной фрагмента памяти.

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

Указатель является просто переменной, поэтому прежде чем работать с ним, его следует объявить. Как и у любой переменной, у указателя имеется имя и тип данных. Единственное отличие в объявлении указателя состоит в прибавлении знака операции "*", говорящего компилятору С++, что вы создаете указатель.

Поскольку указатель создается с использованием операции косвенной ссылки (еще говорят "косвенной адресации" или "разыменования" или "раскрытия ссылки" или "обращения по адресу"), можно смешивать в одном объявлении указатели и обычные переменные

Следует обратить особое внимание на то, что указатель может ссылаться только на объекты того типа, который присутствует в его определении. Исключением являются указатели, в определении которых использован тип void - отсутствие значения. Такие указатели могут ссылаться на объекты любого типа, однако к ним нельзя применять операцию разыменования (для void *pAdr объект по адресу pAdr не определен).

Указатель можно инициализировать специальной константой NULL, которая определена в файле stdio.h, и соответствует заведомо не равному никакому адресу значению, принимаемому за нулевой адрес.

В языке С над указателями допустимы следующие (основные) операции:

- присваивание;

- получение значения того объекта, на который ссылается указатель;

- получение адреса самого указателя;

- унарные операции изменения значения указателя;

- аддитивные операции;

- операции сравнения.

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

При рассмотренном нами правиле определения массива его размер (по крайней мере максимум) должен быть известен уже при написании программы. Однако на практике часто размер массива является результатом проведенных вычислений и в момент написания программы еще не известен. В этом случае создаются так называемые массивы динамической памяти.

Формирование массивов с переменными размерами можно организовать с помощью указателей и средств для динамического выделения памяти. Такими средствами является набор специальных функций, описанных в заголовочных файлах alloc.h - Borland, malloc.h - Microsoft).

1.1.2.Указатель на функцию

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

Самый употребительный указатель на функцию - это ее имя (идентификатор). <имя_функции> в ее определении и в ее прототипе подобен имени массива и является указателем-константой. Он навсегда связан с определяемой функцией и не может быть "настроен" на что-либо иное, чем ее адрес.

Указатель на функцию как переменная вводится отдельно от определения и прототипа какой-либо функции. Для этих целей используется конструкция:

<тип> (*<имя_указателя>)(<спецификация_параметров>);

где <тип> - определяет тип возвращаемого функцией значения;

<имя_указателя> - идентификатор, произвольно выбранный программистом;

<спецификация_параметров> - определяет состав и типы параметров функции.

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

Важно, что тип указателя-переменной должен полностью соответствовать типу функции, адрес которой ему присваивается.

Указатели-переменные могут группироваться в массивы, при этом используется следующая форма их определения:

<тип> (*<имя_массива>[<размер>])(<спецификация_параметров>);

где <тип> - определяет тип возвращаемых функциями значений;

<имя_массива> - идентификатор, произвольно выбранный программистом;

<размер> - количество элементов в массиве;

<спецификация_параметров> - определяет состав и типы параметров функций.

2.ПРАКТИЧЕСКАЯ ЧАСТЬ

2.1.Описание программы 5LB1.cpp

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

2.2.Описание программы 5LB2.cpp

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

ЗАКЛЮЧЕНИЕ

  • При создании программы даже с довольно средним интерфейсом не обойтись без использования указателей, что говорит о их важной роли в программах С++

  • При создании программы зачастую возникают проблемы при использовании указателей, так называемые висячие указатели которые содержат адрес динамической переменной ранее удаленной и при этом они могут ссылаться на новую динамическую переменную тип которой отличен от предыдущей

  • Работать с указателями зачастую удобнее, чем с самими массивами

Список литературы

  1. Подбельский В.В. Язык Си++. – М.: Финансы и статистика,1996.­­­­­–560 с.

  2. Дейтел Х., Дейтел П. Язык пограммирования С++: перевод с англ.

М.:ЗАО «Издательство БИНОМ»,1998,1024с.

Соседние файлы в папке мои отчёты