Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
21
Добавлен:
28.03.2016
Размер:
72.7 Кб
Скачать

Лабораторная работа 7

Исcледование работы с указателями

Цель работы: Изучение приемы работы с указателями на переменные разного типа.

Ход работы:

  1. Используя методические указания, разработать Си - программу содержащую 6 переменных одного типа и 2 указателя на любые эти переменные.

  2. Вывести на екран:

Размер (количество байтов) выделенных под переменные и указатели

Значения переменных

Значения указателей

Адреса в ОП всех переменных

Адреса в ОП всех указателей

Результат вычитания указателей

  1. Над указателями провести операции

Сложение указателей с целым числом

Вычитание из указателя целого числа

Декремента

Инкремента

Операции отношения: ==, <= ,< ,> ,>= ,!=

Результаты операций вывести на экран

4. Создать указатель на указатель и вывести на экран

Адрес в ОП этого указателя

Значение этого указателя

5. Создать неопределенный указатель и использовать его для указанияна любую из ранее обьявленных переменных.Вывести на экран значение этого указателя.

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

Указатели широко применяются в С++ - отчасти потому, что в некоторых случаях без них просто не обойтись, а отчасти потому, что программы с ними, обычно, короче и эффективнее.

Определения указателя.

Указатель -это переменная, содержащая адрес переменной.

Указатель -это переменная, содержащая адрес памяти, где расположены другие объекты (переменные, функции и т.п.).

Второе определение правильней, так как в действительности указатели могут содержать не только адрес переменной, но и адреса других объектов. Язык С++ позволяет Вам определить объект, который будет содержать указатель на объекты любого основного или производного типа данных.

Для определения указателя используется символ * в определении или объявлении объекта. Синтаксис определения указателя имеет вид:

                    класс_хранения     спецификация_типа    *идентификатор;

Символ * в этом контексте означает "указатель на". Приведем несколько примеров:

int *iptr;   //Определяет указатель на целое значение

float *fvals;   //Определяет указатель на значение с плавающей точкой

char *cp;  //Описывает указатель на символ

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

Как работать с указателями?..

Первый шаг в применении указателя - присвоить ему значение адреса. Для этого надо иметь возможность получить адрес, по которому в памяти расположен какой-то другой объект. Унарный оператор & выдает адрес объекта, так что инструкция р=&с; присваивает адрес ячейки с переменной р  (говорят, что р указывает на с или, что то же, р ссылается на с). Оператор & применяется только к объектам, расположенным в пямяти. Его операндом не может быть ни выражение, ни константа.

Унарный оператор * есть оператор раскрытия ссылки (или, унарная операция взятия косвенного адреса, или операция разыменования - запоминать ВСЕ необязательно, но знать что это такое - необходимо). Примененный к указателю он выдает объект, на который данный указатель ссылается. Предположим, что х и у целые, а ip- указатель на іnt. Следующие несколько строк показавают, каким образом объявляются указатели и используются операторы & и *.

int x=1, y=22, z[10];

int *ip; // ip – указатель на int

ip=&x; // тепер ip указывает на х

y=*ip; // y тепер равен 1

*ip=0 // x теперь равен 0

ip=&z[0]; //ip тепер указывает на z[0]

Описания x, y, и z Вам уже знакомы. Объявление указателя ip int *ip; буквально гласит следующее: выражение * ip есть указатель на целое.

Вы, наверное, заметили, что указателю разрешено ссылаться только на объекты заданого типа  (существует одно исключение: указатель на void может ссылаться на объекты любого типа, но к такому указателю нельзя применять оператор раскрытия ссылки. Об особенностях использования типа void мы поговорим позже)

Рассмотрим вопрос связанный с арифметическими операциями над указателями. Если ip ссылается на х целого типа, то * ip можно использовать в любом месте, где допустимо применение х, например:

*ip=*ip+10; //увеличивает ip на 10;

Унарные операторы * и & имеют более высокий приоритет, чем арифметческие операторы, так что встретив присваивание y=*ip+1 компилятор возмет то, на что указывает и добавит к нему 1, а результат присвоет переменной у. Аналогично *ip+=1 увеличивает на единицу то, на что ссылается ip; те же действия выполняют ++*ip и (*ip)++. В последней записи скобки необходимы, поскольку, если их не будет, увеличится значение самого указателя, а не то, на что он ссылается. Это обусловлено тем, что унарные операторы * и ++ имеют одинаковые приоритет и порядок выполнения - справа налево. И, наконец, так как указатели сами являются переменными, в тексте они могут встречаться и без оператора раскрытия ссылки. Например, если iq есть указатель на int, то iq=ip копирует содержимое ip в iq, чтобы ip и iq ссылались на один и тот же объект. Указатели можно использовать как операнды в арифметических операциях. Если у - указатель, то унарная операция у++; увеличивает его значение; теперь оно явлется адресом следующего элемента. Указатели и целые числа можно складывать. Конструкция y+n (y-указатель, n-целое число) задает адрес n-го объекта, на который указывает у. Это справедливо для указателей на любой тип; компилятор будет масштабировать приращение адреса в соответсвии с типом, определенным из соответсвующего объявления.

Любой адрес можно проверить на равенство (==) или неравнство (!=) со специальным значением NULL, которое позволяет определить ничего не адресующий указатель.

Заметим, что указатели можно сравнивать с помощью операций отношения (<, >, <=, >=, !=  и  ==). Однако следует быть осторожным, так как  в сравнении должны участвовать указатели, которые адресуются к данным одного и того же типа.

Варианты заданий:

№ задания

Тип переменных

1

int

2

unsigned int

3

Short int

4

Long int

5

Unsigned long int

6

Unsigned short int

7

float

8

double

9

Long double

10

Char

11

float

12

double

13

unsigned int

14

Char

15

double

16

float

17

unsigned int

18

double

19

int

20

unsigned int

21

Short int

22

Long int

23

Unsigned long int

24

Unsigned short int

25

float

26

double

27

Long double

28

Char

29

int

40

unsigned int

Отчет по лабораторной работе должен содержать

1. :Номер лабораторной работы.

2. Наименование и цель лабораторной работы.

3. Условие согласно Вашего варианта.

4. Схема алгоритма.

5. Программный код.

6. Результаты выполнения программы.

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