- •Московский государственный институт пищевой промышленности
- •Type * имя указателя;
- •Int **p7; //неинициализированный указатель на объект типа int * // р7 – указатель на указатель
- •1.2. Типы указателей и операции над ними
- •Операция разыменования
- •Операция преобразования типов
- •Операция присваивания
- •Операция получения адреса указателя
- •Операция сложения и вычитания
- •Операции отношений (операции сравнений)
- •1.3. Массивы Массивы и переменные с индексами
- •Int z[100]; // одномерный массив из 100 элементов типа int char s[80]; // одномерный массив из 80 элементов типа char (строка) float y[3][4];// двумерный массив из 12 элементов типа float
- •Задача – 1
- •Математическая постановка задачи
- •Задача – 2
- •Математическая постановка задачи
- •Инициализация массивов
- •Массивы и указатели
- •Динамические массивы
- •2. Функции, передача параметров
- •2.1.Определение функции
- •Void Sum(float *s,float *X, int n); //прототип функции Sum
Int **p7; //неинициализированный указатель на объект типа int * // р7 – указатель на указатель
Рассмотрим более сложные случаи описания указателей:
float * pm[5];// массив указателей на тип float из 5 элементов float (*pz) [5];// указатель на массив из 5 элементов типа float
Запомните последний случай. В нем описан указатель pzна одномерный массив из 5 элементов. Описание таких указателей нам понадобится в следующем разделе.
Далее возникает вопрос. А как использовать указатели на объекты при обработке данных? Дело в том, что указатель можно использовать с одной стороны как обычную переменную (в пределах разрешенных для этой переменной операций), а с другой стороны, появляется дополнительная возможность выполнять операции над полем, на которое указывает хранимый в указателе адрес.
1.2. Типы указателей и операции над ними
Основные типы указателей определяются ключевыми словами char, int, float, long, double, short, unsigned, signed, void. Возможны также типы объектов, описываемые программистом, но с этой возможностью мы будем знакомиться позже. Напомним, что типvoid предполагает отсутствие значения, а указатели типаvoid имеют некоторые особенности, которые должны учитываться при выполнении операций над такими указателями (с ними познакомимся в последующих главах).
Операции над указателями можно представить следующим списком:
Операция разыменования, или доступа по адресу - * указатель;
Преобразование типов (приведение типов);
Присваивание;
Получение (взятия) адреса- &;
Сложение и вычитание (аддитивные операции);
Инкремент, или автоувеличение – (++);
Декремент, или автоуменьшение (--);
Операции отношений (сравнения).
Операция разыменования
Операция разыменования указателя ‘*’имеет формат : *указатель. Операция разыменования обеспечивает доступ к полю, адрес которого содержится в указателе.Унарное выражение*указательобладает в некотором смысле правами переменной. Рассмотрим следующий пример:
int z =20;
int * p = &z;
printf (“z = %d *p = %d\n”, z, *p);
*p = 30; printf (“z = %d *p = %d\n”, z, *p);
Выражение *pв этом примере служит синонимом имениz. При выполнении операторов примера на мониторе получим следующее:
z = 20 *p = 20 z= 30 *p = 30
Таким образом, выражение *указатель может использоваться практически везде, где допустимо использование имен объектов того типа, к которому относится указатель. Это утверждение справедливо лишь в том случае, если указатель инициализирован при объявлении явным образом или ему присвоен адрес конкретного объекта либо значение уже инициализированного указателя.
Отметим важную особенность операции разыменования. Результат этой операции зависит не только от значения указателя, но и от его типа. Дело в том, что при доступе к памяти с помощью указателя требуется информация не только о размещении объекта, но и о размерах участка памяти, который будет использоваться. Эту дополнительную информацию компилятор получает из типа указателя. Указатель char * pc; при обращении к памяти будет использовать участок памяти в 1 байт. Указатель long double * pd; будет использовать участок в 10 смежных байт памяти.
Запомните также, что операцию разыменования нельзя непосредственно применить к указателю типа void *! Ниже приводится пример такой неправильного применения этой операции:
int x = 50; void p = &x;
printf (“*p = %d \n”, *p);// здесьошибка!
Ошибка заключается в том, что операция *p невыполнима, т. к. при использовании указателя типа void в операции разыменования тип поля, на которое он указывает, неизвестен (это тип void, т. е. он “никакой”). Если же все-таки необходимо посмотреть какое – либо поле, на которое указывает такой p, то нужно одновременно с операцией разыменования использовать операцию преобразования типа. Но об этом смотрите далее.
