
- •1 Введение в теорию алгоритмизации 6
- •Введение
- •1 Введение в теорию алгоритмизации
- •1.1 Понятие алгоритма
- •1.2 Свойства алгоритмов
- •1.3 Формы представления алгоритма
- •1.4 Основные алгоритмические структуры
- •1.5 Алгоритмический язык
- •2.3 Инструменты программирования Microsoft Visual Studio
- •2.5 Консольные и оконные приложения
- •2.6 Компилирование программы
- •3.2 Простые типы данных
- •3.3 Операции над числовыми данными
- •3.4 Объявление переменных
- •3.7 Директива #define
- •3.9 Библиотека математических функций
- •4 Условный оператор
- •4.1 Условный оператор if
- •4.2 Составной оператор
- •4.3 Вложенный оператор
- •4.4 Оператор выбора switch
- •5 Операторы циклов
- •5.1 Определение цикла
- •5.2 Оператор цикла for
- •5.3 Оператор цикла while
- •5.4 Оператор цикла do while
- •5.5 Табулирование функций
- •5.6 Вычисление конечных сумм и произведений
- •5.7 Управляющие конструкции break, continue, return, goto
- •6 Массивы
- •6.1 Понятие и описание массивов
- •6.2 Одномерные массивы
- •6.3 Двумерные массивы (матрицы)
- •7 Символьные массивы
- •7.1 Описание символьного массива
- •7.2 Стандартные библиотечные функции над строками
- •8 Указатели и операции над указателями
- •8.1 Описание указателей
- •8.2 Операции над указателями
- •8.3 Сравнение указателей
- •8.4 Связь между массивом и указателем
- •9 Функции
- •9.1 Модульное программирование
- •9.2 Объявление функции
- •9.3 Формальные и фактические параметры функции
- •9.4 Локальные и глобальные переменные
- •10 Элементы объектно-ориентированного программирования
- •10.1 Инструментальное программное обеспечение
- •10.2 Технологии программирования
- •10.3 Создание класса
- •11 Полиморфизм
- •12 Этапы разработки программного обеспечения
- •12.1 Идея и цель объектно-ориентированного программирования
- •12.2 Основные понятия объектно-ориентированного программирования
- •12.3 Методы тестирования программных продуктов
- •Список литературы
8 Указатели и операции над указателями
Цель работы: изучить определение, назначение, виды и описание указателей, приобрести навыки в решении задач с помощью указателей.
8.1 Описание указателей
Для доступа к данным процессор использует адреса. И когда компилятор обрабатывает оператор определения переменной, например,
int p1=10;
он выделяет память в соответствии с типом (int) и инициализирует ее указанным значением (10). Все обращения в программе к переменной по ее имени (p1) заменяются компилятором на адрес области памяти, в которой хранится значение переменной.
Для хранения адресов областей памяти предназначены указатели.
Формат объявления указателя на объект:
Тип *имя;
Пример 8.1
int *p1;
Переменная p1представляет собой указатель на тип int.
Для работы с указателями в С используются две операции: * и ?.
В результате выполнения операции & определяется адрес ячейки памяти, которая соответствует переменной. Если b – имя переменной, то &b – ее адрес.
Например, если задать указателю имя a, то оператор
а=&b;
присваивает адрес b переменной а. Различие между двумя формами записи: а и &b, заключается в том, что а – это переменная, в то время как &b – константа. Предположим, что переменная b хранится в ячейке памяти под номером 2000, а ее значение равно 37. Тогда переменной а будет присвоено значение 2000.
Вторая операция над указателями * – операция косвенной адресации, выполняет действие, обратное по отношению к &.
Оператор а=*b; может быть прочитан так: «а получает значение переменной, расположенной по адресу b».
8.2 Операции над указателями
Пример 8.2
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
int Dec =10;
int *Ptr;
using namespace System;
int main(array<System::String ^> ^args)
{
// присваивание указателю Ptr адреса переменной Dec
Ptr=&Dec;
*Ptr = *Ptr+3;
// вывод на экран значений *ptr, ptr и &Dec
printf("\n%d\n",*Ptr);
printf("%d\n",Ptr);
printf("%d\n",&Dec);
getch();
return 0;
}
Операции ++ и -- значение указателя увеличивают или уменьшают на длину типа, на который ссылается используемый указатель:
int *ptr, a[10];
ptr=&a[5];
ptr++; /* равно адресу элемента a[6] */
ptr--; /* равно адресу элемента a[5] */
В бинарных операциях сложения и вычитания могут участвовать указатель и величина типа int. При этом результатом операции будет указатель на исходный тип, а его значение будет на указанное число элементов больше или меньше исходного:
int *ptr1, *ptr2, a[10];
int i=2; ptr1=a+(i+4); /* равно адресу элемента a[6]*/
ptr2=ptr1-i; /* равно адресу элемента a[4]*/
В операции вычитания могут участвовать два указателя на один и тот же тип. Результат такой операции имеет тип int и равен числу элементов исходного типа между уменьшаемым и вычитаемым, причем если первый адрес младше, то результат имеет отрицательное значение:
int *ptr1, *ptr2, a[10];
int i;
ptr1=a+4;
ptr2=a+9;
i=ptr1-ptr2; /* равно 5 */
i=ptr2-ptr1; /* равно -5 */
8.3 Сравнение указателей
Пример 8.3. Значения двух указателей на одинаковые типы можно сравнивать в операциях ==, !=, <, <=",">, >= при этом значения указателей рассматриваются просто как целые числа, а результат сравнения равен 0 (ложь) или 1 (истина).
int *ptr1, *ptr2, a[10];
ptr1=a+5;
ptr2=a+7;
if (prt1>ptr2) a[3]=4;
В данном примере значение ptr1 меньше значения ptr2 и поэтому оператор a[3]=4 не будет выполнен.