- •1.Моделированьепроцесса решения.
- •2. Формализация процесса решения задачи.
- •1) Поиск решения эквивалентной задачи.
- •3.Интуитивное понятие алгоритма.
- •4.Основные свойства алгоритма.
- •5.Взаимосвязь между набором элементарных операций и исполнителем алгоритма.
- •6. Способы изображения алгоритма.
- •7.Введение в язык Си: истоки, парадигма программирования (отношение между набором алгоритмов и набором данных в программах).
- •8.Структура программ на языке Си. Директива процессора, комментарии.
- •11. Описание переменной: имя переменной; строчные и прописные буквы в идентификаторах, задание начального значения (инициализация).
- •15.Преобразование операндов в арифметических выражениях.
- •16.Сложние объявления и элементы объявления.
- •17.Указатели (2 категории).
- •19. Оператор постфиксного увеличения/ уменьшения.
- •20. Оператор префиксного увеличения/ уменьшения.
- •21. Простой оператор присваивания.
- •22. Составные операторы присвоения.
- •23. Условный оператор if.
- •24. Оператор выбора switch.
- •25. Понятие массива, описание массива, размерность массива, размещение в памяти.
- •26. Описание массива имеет вид:
- •27. Массивы символов и литеральные строки.
- •28. Операторы цикла (for, while и do-while) для работы с массивами.
- •29. Многомерные массивы: описание, размещение в памяти, инициализация, обращение к элементам.
- •30. Взаимосвязь массивов и указателей. Описание указателя.
- •32. Указатель типа void*. Преобразование указателя операцией приведения типа.
- •33. Доступ к переменным через указатели: операция & и операция *.
- •37.Синтаксис объявления (--заголовка, --прототипа ) функции. Оператор return
- •38. Понятие формальных параметров и фактических аргументов (при вызове ф-ции). Переменное число аргументов или аргументы с изменяющимися типами (многоточие).
- •39. Указатель на функцию
- •40. Перегрузка функций
- •41. Итерпритация сложных описаний изнутри наружу.
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 и переполнения с плавающей точкой (выход за диапазон отведенной памяти).
Переполнение целых игнорируется (иногда могут обнаруживаться специальными библиотечными функциями).
