Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР15-С++24-мая-2012.doc
Скачиваний:
23
Добавлен:
23.09.2019
Размер:
1.07 Mб
Скачать

Министерство финансов Российской Федерации

Всероссийская государственная налоговая академия

ИНФОРМАТИКА И ПРОГРАММИРОВАНИЕ

Бакалавры: 230700 "Прикладная информатика"

Язык программирования С++

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

ПРОГРАММИРОВАНИЕ

С ИСПОЛЬЗОВАНИЕМ УКАЗАТЕЛЕЙ

Автор профессор кафедры "Прикладной информатики в экономике"

кандидат технических наук Л.К. Кузнецов

18 мая 2012 г.

Москва

ВГНА

2012

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

Программирование с использованием указателей

Цель работы:

Ознакомиться:

  • с понятием указатель;

  • с моделями памяти в языке С++;

  • с видами структур;

  • с понятием структурированной переменной;

  • с правилами создания динамических массивов на языке С++;

  • с приемами обработки динамических массивов;

  • с операциями динамического выделения и освобождения памяти;

  • с операциями косвенного обращения к элементам массива.

Изучить типовые алгоритмы обработки информации с использованием указателей.

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

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

1. Краткие теоретические сведения

Ниже приводятся минимальные сведения, необходимые только для вы­полнения лабораторной работы

1.1. Понятие указателя

В языке Си существует два способа доступа к переменной: ссылка на переменную по имени и использование механизма указателей. Механизм указателей в Си – одна из наиболее привлекательных для профессиональных программистов особенностей языка.

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

Указатель – это переменная, значением которой является адрес некоторого объекта (обычно другой переменной) в памяти компьютера. Подобно тому, как переменная типа char имеет в качестве значения символ, а переменная типа int – целочисленное значение, переменная типа указателя имеет в качестве значения адрес ячейки оперативной памяти. Допустимые значения для переменной-указателя – множество адресов оперативной памяти компьютера.

Указатель является одной из наиболее важных концепций языка C.

Правильное понимание и использование указателей особенно необходимо для составления хороших программ по следующим причинам:

     указатели являются средством, при помощи которого функции могут изменять значения передаваемых в нее аргументов;

     при помощи указателей выполняется динамическое распределение памяти;

     указатели позволяют повысить эффективность программирования;

     указатели обеспечивают поддержку динамических структур данных (двоичные деревья, связные списки).

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

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

Указатель-переменная (или просто указатель) – это переменная, предназначенная для хранения адреса в памяти.

Указатель-константа – это значение адреса оперативной памяти. В языке Си определены две специальные операции для доступа к переменным через указатели: операция ― "&" и операция ―"*". Результатом операции ―"&" является адрес объекта, к которому эта операция применяется. Например, &var1 дает адрес, по которому var1 хранится в памяти (точнее адрес первого байта var1). Операция ―"*" – это операция обращения к содержимому памяти по адресу, хранимому в переменной-указателе или равному указателю-константе.

Признаком переменной-указателя для компилятора является наличие в описании переменной двух компонентов:

1) типа объекта данных, для доступа к которому используется указатель (или, как часто говорят, на который ссылается указатель);

2) символа ―"*" перед именем переменной.

В совокупности тип и ―"*" воспринимаются компилятором как особый тип данных – "указатель на что-либо".

Таким образом, описание int var1, *ptr приводит к появлению переменной var1 и указателя-переменной ptr. Указатель ptr имеет тип *int, т.е. тип ― "указатель на целое". Место, выделяемое под такой тип компилятором, зависит от модели памяти.

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

Например, оператор присваивания *ptr = *ptr2 + 4 можно интерпретировать так: взять содержимое памяти по адресу, равному значению указателя ptr2, прибавить к этому содержимому 4, а результат поместить по адресу, равному значению указателя ptr. Число байтов, извлекаемых из памяти и участвующих в операции, определяется компилятором исходя из типа, на который ― "указывает" указатель.

Указатель - это переменная, значением которой является адресс другой переменной. Так как указатель может ссылаться на переменные разных типов, с указателем в языке Си связывается тип того объекта, на который он ссылается. Для описания указателей используется операция косвенной адресации *. Например, указатель целого типа uk описывается так : int *uk. Унарная операция &, примененная к некоторой переменной, показывает, что нам нужен адресс этой переменной, а не ее текущее значение. Если переменная uk объявлена как указатель, то оператор присваивания uk=&x означает: "взять адресс переменной x и присвоить его значение переменной-указателю uk".

Как вы уже знаете, программы на C++ хранят переменные в памяти. Указатель представляет собой адрес памяти, который указывает (или ссылается) на определенный участок. Из урока 10 вы узнали, что для изменения параметра внутри функции ваша программа должна передать адрес параметра (указатель) в функцию. Далее функция в свою очередь использует переменную-указатель для обращения к участку памяти. Некоторые программы, созданные вами в нескольких предыдущих уроках, использовали указатели на параметры. Аналогично этому, когда ваши программы работают с символьными строками и массивами, они обычно используют указатели, чтобы оперировать элементами массива. Так как применение указателей является общепринятым, очень важно, чтобы вы хорошо понимали их использование. Таким образом, этот урок рассматривает еще один аспект применения указателей. К концу данного урока вы освоите следующие основные концепции:

  • Для простоты (для уменьшения кода) многие программы трактуют символьную строку как указатель и манипулируют содержимым строки, используя операции с указателями.

  • Когда вы увеличиваете переменную-указатель (переменную, которая хранит адрес), C++ автоматически увеличивает адрес на требуемую величину (на 1 байт для char, на 2 байта для int, на 4 байта для float и т.д.).

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

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