
- •Московский государственный институт пищевой промышленности
- •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
Московский государственный институт пищевой промышленности
ИНСТИТУТ ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
проф. Карпов В. И. ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ
Юнита2. Функциональное программирование на С и С++
МОСКВА-2003
Тематический обзор
1.Адреса, указатели, массивы
1.1.Указатели и адреса объектов
Познакомимся с новым для нас объектом – указателем.Указателем называется такой объект программы, который обладает двумя свойствами:
Значением любого указателя может быть только какой - либо адрес участка оперативной памяти, выделенный под конкретный объект;
С указателем всегда связан тип объекта, для которого выделен этот участок.
Таким
образом, указатель, значение которого
определено, указывает адрес объекта в
оперативной памяти и его тип, который
определяет количество выделенных под
этот объект байтов. Другими словами,
указатель дает возможность реализации
доступа к определенному участку
оперативной памяти. Этот факт
демонстрируется на рис. 1
На этом рисунке значение указателя равно 0FFC, т.е. он указывает на байт с адресом 0FFC. Длина поля (в данном случае 4 байта, выделенные серым цветом) известна системе из объявления указателя в программе, в котором всегда обозначается тип объекта, на который может указывать указатель.Напомним, что адресом любого участка оперативной памяти называется наименьший адрес среди всех адресов байтов участка (младший адрес). Т. е. в нашем случае адресом поля, выделенного серым цветом, является 0FFC.
В простейшем случае объявление указателя на некоторый объект имеет вид:
Type * имя указателя;
где type –обозначение типа,имя указателя – идентификатор.
Таким образом, признаком указателя при лексическом разборе объявления объекта служит символ ‘*’, помещенный перед именем. Ниже представлены примеры объявления указателей:
int *p1, *p2;
float *p3, *p4;
В этом примере p1, p2 – это указатели на поле типаint, аp3,p4 – указатели на поле типаfloat. А какова длина участка поля, на которое могут указывать эти указатели? Дляp1, p2 –это 2 байта (поле типаint занимает 2 байта), а дляp3,p4 – 4 байта (поле типаfloat занимает 4 байта). Для размещения самих указателей количество выделяемых байтов зависит от реализации компилятора и может быть от 2 до 4 байтов. В стандартизуемом варианте языка С++ предполагается, что все указатели одинаковы, т. е. внутреннее представление адресов всегда одно и то же. Однако в реализациях компиляторов для конкретных вычислительных машин это не всегда справедливо. Практически все компиляторы языка С++ обязательно учитывают архитектурные особенности аппаратных средств и включают дополнительные возможности для того, чтобы программист мог их эффективно использовать. Сейчас, однако, мы безболезненно пропустим эти тонкости, и будем считать, что в наших рассматриваемых случаях все указатели одинаковы и для размещения каждого выделяется два байта.
При объявлении указателя возможно выполнить его инициализацию (присвоить ему какое – либо значение). В этом случае возможны две формы объявления:
type * имя указателя = инициализирующее выражение;
type * имя указателя = (инициализирующее выражение);
В качестве инициализирующего выражения используетсяконстантное выражение, частными случаями которого могут быть:
Явно заданный участок памяти;
Указатель, уже имеющий значение;
Выражение, позволяющее получить адрес объекта с помощью операции & - определения адреса.
Указатель может принимать особое значение, называемое пустым, или нулевым. Это значение отлично от значения указателя на любой конкретный объект. Кроме того, внутреннее (битовое) представление пустого указателя может отличаться от битового представления целого значения 0. Нулевое значение адреса, соответствующее значению пустого указателя, имеет специальное обозначение NULL.
Если значение константного выражения равно нулю, то это нулевое значение преобразуется к пустому (нулевому) указателю. Ниже приведены примеры объявлений указателей:
int x = 5; // целочисленная переменная
float y = 45.6; // действительная переменная
char c = ‘a’; // символьная переменная
char * p (NULL); //нулевой указатель на объект типа сhar
char *p1; //неинициализированный указатель на объект типа сhar
char *p2 = &c; // инициализированный указатель на объект типа сhar
float *p3 = &y; // инициализированный указатель на объект типа float
int * p4 = &x; // инициализированный указатель на объект типа int int * p5; //неинициализированный указатель на объект типа int char *p6; //неинициализированный указатель на объект типа сhar