
- •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. Итерпритация сложных описаний изнутри наружу.
30. Взаимосвязь массивов и указателей. Описание указателя.
В отличии от массива ссылок, массив указателей является допустимым:
int &jar[]={ix, jx, kx}; // приводит к ошибке
int *iar[]={&ix, &jx, &kx}; // правильно
Имя массива по умолчанию считается указателем на первый элемент массива.
int arr[10];
arr ↔ & arr [ 0 ]
arr [ i ] ↔ & (arr +i)
адрес i-го эл-та
int members = sizeof(arr) / sizeof(int); //=10
или на размер любого из эл-ов
int a1[100], b1[100];
int * pa=a1; //& a1 [0]
int * pb=b1; //& b1 [0]
for (i=0; i<100; i++)
{* pb ++ = * pa ++;}
Для многомерного массива, его имя является указателем-константой на массив указателей-констант, эл-ты которого содержат адрес начала каждой из строк этого массива:
int arr1[10] [10];
arr1[0] ↔ & arr[0] [0] , т.е. эквивалентно адресу на строку
arr1[1] ↔ & arr[1] [0]
Способы обращения к массиву:
float T[5][5];
T[ i ][ j ]
* (T[ i ] + j)
* ( *(T+i) + j )
Способ доступа к переменной: по имени, через механизм указателей.
Указатель-константа – это значения адреса оперативной памяти, которое изменить нельзя .
Указатель-переменная (=просто указатель) – это переменная для хранения адреса памяти, обычно другой переменной/ объекта.
Описание:
<имя> * <имя_перем.> [=<нач_зн.>];
int * p_int;
long * p1;
float t ; float * ptr = &t;
31. Арифметические действия с указателями, зависимость результата от типа указателя.
Число байтов участвующих в любой операции с указателем (извлечение из памяти или размещение в памяти) определяется компилятором исходя из того типа данных, на которых указатель ссылается.
Для: 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).
Сравнение указателей имеет смысл только когда они относятся к одному и тому же массиву.