Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Proga (pechat).docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
90 Кб
Скачать
☆

17.Указатели (2 категории).

Способ доступа к переменной: по имени, через механизм указателей.

Указатель-константа – это значения адреса оперативной памяти, которое изменить нельзя .

Указатель-переменная (=просто указатель) – это переменная для хранения адреса памяти, обычно другой переменной/ объекта.

Описание:

<имя> * <имя_перем.> [=<нач_зн.>];

int * p_int;

long * p1;

float t ; float * ptr = &t;

Место выделяемое под переменную типа указатель зависит от модели памяти (мб ук-ль far или near).

int var1, * ptr = (int * ) 200;//если не зад-я конст-а

int * ptr2 = & var1;

Операция ссылка & - взять адрес объекта. Операция * - взять из адреса содержимое.

var1=15;

*ptr=*ptr2 + 10; //=25, более гибкое

Равносильно: t = var1 + 10;

Число байтов участвующих в любой операции с указателем (извлечение из памяти или размещение в памяти) определяется компилятором исходя из того типа данных, на которых указатель ссылается.

Для: void * ppp;

Обязательно: ( char * ) ppp;

Операция разиминования не может применятся к константе так как она не имеет доступного адреса в памяти.

Существуют ограничение на использованье &:

1) нельзя определить адрес константы

//int p1 = & 0xff00; - error

2)нельзя определить адресс значения вычисления как результат арифметического выражения.

Int var1 = 3 , * ptr;

// ptr= & ( var1 * 5); - error

3)Нельзя получить адрес переменной описанной как register

Unsigned int register r1; & r1;

Сама переменная-указатель тоже имеет адрес, поэтому будет корректным выражение:

int a, *ptr 1, *ptr2 = & a;

ptr1 = ( int * ) & ptr2;

Указатель типа void * часто называют родовым (generic), он не отражать информацию о размере объекта в памяти и может использоваться в таком выражении:

unsigned long block = 0xffeeddcc; void * p = & block;

char ch; unsigned <int> two_bytes;

long int four_bytes;

ch=*(char*)p; // ch=0xcc;

two_bytes= *(unsigned*)p; // two_bytes=0xddxx

four_bytes=*(long int *) p; // four_bytes=0xffeeddcc;

Для указателей-переменных допустимы следующие операции:

- присваиванье

- инкремент / декремент

- сложение/ вычитание

- сравнение

Арифметические операции с указателем выполняются по специальным правилам:

type * ptr + [-] N то значение указ-я изменяется на N*sizeof (type) (N - константа)

Разность двух указателей – это разность их значений, делённая на sizeof (type).

Сравнение указателей имеет смысл только когда они относятся к одному и тому же массиву.

Указатель на ф-цию

На этапе работы программы ф-цию можно вызывать или брать адрес.

Переменная с адресом указателем на ф-цию.

Для просто указателя определены математические операции.

float * p;

р+5 – продвижение на 5 эл-ов типа.

Указатели на ф-цию не допускают математических операций:

<тип> ( * <ид-р_указ-я>) (<список_типов_парам>);

Если напишем <тип> * (<ид-р_указ-я>).., то смысл – ф-ция, которая возвращает адрес int, т.е. это тип результата

Пример:

v oid good_msg(char*);

v oid error_msg(char *);

void (* efct) (char *);

v

Равно-

сильно

oid f()

{…

e rror_msg(“Фаил не найден”);

e fct = error_msg; //↔efct=&error_msg;

e fct(“Запись не найдена”);

efct = error_msg; //↔efct=&error_msg;

efct(“Обработка файла завершена”);

}

18.Выражения в С++: порядок вычисления, ошибки и переполнение.

Выражения состоят из операторов, констант, функций и переменных. В языке С выражением считается любая допустимая комбинация этих элементов.

С++ позволяет перегрузить некоторые стандартные операторы, то есть определить новое поведение оператора при использовании классов в выражении:

сout<<c;

Однако перегрузка не может изменить приоритет оператора.

В языке С порядок вычисления подвыражений, входящих в выражения, не определен. Компилятор может сам перестраивать выражения, стремясь к созданию оптимального кода.

Каждое подвыражение вычисляется слева на право, а все выражение вычисляется в самое правое выражение.

Ошибки и переполнение (выход за диапазон)

Всегда проявляются ошибки деления на 0 и переполнения с плавающей точкой (выход за диапазон отведенной памяти).

Переполнение целых игнорируется (иногда могут обнаруживаться специальными библиотечными функциями).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]