программинрование / 1 семестр / 7_лаб
.docЛабораторная работа 7
Исcледование работы с указателями
Цель работы: Изучение приемы работы с указателями на переменные разного типа.
Ход работы:
-
Используя методические указания, разработать Си - программу содержащую 6 переменных одного типа и 2 указателя на любые эти переменные.
-
Вывести на екран:
Размер (количество байтов) выделенных под переменные и указатели
Значения переменных
Значения указателей
Адреса в ОП всех переменных
Адреса в ОП всех указателей
Результат вычитания указателей
-
Над указателями провести операции
Сложение указателей с целым числом
Вычитание из указателя целого числа
Декремента
Инкремента
Операции отношения: ==, <= ,< ,> ,>= ,!=
Результаты операций вывести на экран
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 компилятор возмет то, на что указывает iр и добавит к нему 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. Результаты выполнения программы.