Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

Арифметические операции.

int x[10],*x1ptr,*x2ptr; // объявлен массив из целых и два указателя на целое.

Имя массива является также именем указателя, в котором находится адрес массива, т.е. адрес первого элемента массива – x[0]. Поэтому можно написать равнозначные операторы

x1ptr=x; или x1ptr=&x[0];

Значения указателей x1ptr, x2ptr можно изменять. Значение указателя x изменять нельзя, поскольку массив x сохраняет свое положение в памяти во время выполнения программы. Поэтому указатель x с именем массива является константным указателем, в отличие от указателей x1ptr и x2ptr, которые являются переменными указателями.

После выполнения операций - модификация указателя x1ptr+=2 и разыменование *x1ptr будет получен доступ к элементу массива x[2].

Примечание. Нельзя x+=2, поскольку xконстантный указатель, всегда указывает на начало массива.

Для перехода на следующий элемент массива можно использовать для указателя операции инкремента: ++x1ptr, x1ptr++, а для перехода на предыдущий – операции декремента: --x1ptr, x1ptr--.

Переменные указатели можно вычитать один из другого: пусть x1ptr=&x[1]; x2ptr=&x[3]; тогда разность указателей x2ptr - x1ptr даст значение 2.

Присваивание указателей.

Это возможно, если указатели имеют один тип.

float* f1ptr, *f2ptr, x1, x2;

Объявлены указатели f1ptr, f2ptr на вещественное и переменные x1, x2 вещественного типа.

f2ptr=&x2; f1ptr=f2ptr;

Указателю на void* можно присвоить все типы указателей без приведения типа:

void* p; p=f1ptr;

Но указатель на void* нужно сначала привести к типу того указателя, которому он присваивается:

f1ptr=(float*)p;

Сравнение указателей.

Указатели можно сравнивать, если они указывают на элементы одного и того же массива:

if(x2ptr>x1ptr) ………;

Смещение и индексирование указателей.

После выполнения операций с указателем x1ptr - присваивания x1ptr=x; смещения x1ptr+2 и разыменования *(x1ptr+2) будет получен доступ к элементу массива x[2]. Здесь используется запись указатель-смещение, в отличие от записи x[2] – указатель-индекс.

Функции

Функция – это последовательность описаний (объявлений) и операторов, которой дано имя. Функция должна выполнять какое-то законченное действие.

Функция начинает выполняться в момент вызова. До этого она должна быть объявлена и определена. Объявлений может быть несколько, а определений – только одно. Объявление (прототип) должно предшествовать вызову, чтобы компилятор мог проверить правильность вызова.

Объявление функции (прототип)

[класс] тип имя([список параметров]);

В [] – необязательные параметры.

1) Модификатор [класс] – задает области видимости функции:

extern – глобальная видимость во всех модулях программы (по умолчанию);

static – видимость только в пределах модуля, в котором определена функция.

2) Тип возвращаемого функцией значения – может быть любым, кроме массива и функции (но может быть указателем на массив или функцию). Если функция не должна возвращать значения, тип – void.

3) Список параметров определяет величины, которые требуется передать в функцию при её вызове. Для каждого параметра следует обязательно указывать его тип.

Примечания. 1. В прототипе, определении и вызове функции количество, типы и порядок следования параметров должны совпадать.

2. Нельзя возвращать из функции указатель или ссылку на локальную переменную, поскольку память, выделенная под неё, освобождается при возврате из функции. Приведем пример.

int* f()

{ int a=5;

return &a; // нельзя, но можно, если static int a=5;

}

Тип возвращаемого значения и типы параметров совместно определяют тип (сигнатуру) функции.