
- •Оглавление
- •Билет 1: Понятия о структурном программировании
- •Билет 2: Моделирование стандартных управляющих структур
- •Билет 3: структура программы
- •Билет 4: организация (структура) модуля
- •Билет 5: Переменные
- •Билет 6: Система типов языка
- •Билет 7: Арифметические типы языка c
- •Билет 8: Константы
- •Билет 9: КонстантныеобъектывязыкеСи.
- •Билет 10: Константные объекты
- •Билет 11. Переменные, понятие об объекте, lvalue и rvalue выражения.
- •Билет 12. Время жизни переменных.
- •Билет 15. Операторы. Приоритет и ассоциативность операторов.
- •Билет 19: Побочные эффекты в языке Си.
- •Билет 20: Организация функций. Определение функций
- •Билет 25: Инструкция If…else. Программирование разветвлений.
- •Билет 26: Инструкция switch и организация разветвленных алгоритмов.
- •Билет 27: Циклические алгоритмы, классификация, функциональная схема
- •Билет 28: Циклические инструкции.
- •Билет 29: инструкция for и арифметические циклы
- •Билет 30: Инструкция while и do...While, интерационные циклы
- •Билет 31: Циклы с выходом. Бесконечные циклы
- •Билет 32. Организация вложенных циклов
- •Билет 33: Массивы. Определение и инициализация одномерных массивов
- •Билет 34. Массивы. Определение и инициализация двумерных массивов
- •Билет 35. Связь указателей и массивов
- •Билет 40. Указатели. Определение типизированных и нетипизированых указателей. Модель, используемая при работе с указателями. Операции с указателями.
- •Билет 41: Операции с указателями
- •Билет 42. Использование указателей для возврата из функции через параметры
- •Билет 43. Указатели на функцию. Определение. Операции. Использование в параметрах функции
- •Билет 44. Типичные ошибки при работе с массивами
- •Билет 45. Массив указателей, динамическая матрица
- •Билет 46. Понятие некорректного указателя.
- •Билет 47. Организация строк. Общие сведения
- •Билет 48. Ввод/вывод строк
- •Void funk(“Kozin”); - при этом ничего не возвращается. Данная запись используется довольно редко.
- •Билет 52. Организация динамического одномерного массива
- •Билет 53. Структуры. Определение типа структур. Определение переменных в структуре и инициализация. Операции со структурой
- •Билет 54. Обращение к полям структуры. Массивы структур
- •Билет 55. Использование структур при работе с функциями. Указатели на структуры
- •Билет 58: Файловый ввод-вывод. Символьный ввод-вывод в языке Си.
- •Синтаксис преобразования вывода
- •Билет 60: Файловый ввод-вывод. Строковый ввод-вывод в языке Си.
- •Билет 61: Файловый ввод-вывод. Блоковый ввод-вывод в языке Си.
- •Int fseek(file *f, long int колич_байт, int начало_отсчета);
Билет 42. Использование указателей для возврата из функции через параметры
Пожалуй, самый короткий билет. Чтобы вернуть из функции более одного значения, необходимо в качестве параметров передавать указатели. Тогда после завершения функция вернет через указатели все значения в main. Это также является примером полезного использовании побочных эффектов в С.
Примерпрограммы:
void run_to(int *p) {…};
int main(void)
{
int position;
run_to(&pozition); //допустим, при выполнении данной функции изменяется текущая позиция курсора, //тогда после выполнения в переменной окажется измененное значение курсора
}
Пример взят с потолка, поэтому Козину лучше дать свой, более применимый в жизни.
Билет 43. Указатели на функцию. Определение. Операции. Использование в параметрах функции
Указатели на функцию содержат адрес программного кода.
Пример объявления: double (*pf)(double x); - double является возвращаемым значением, (*pf) – имя указателя, а (double x) – передаваемые функции значения.
Получаем квази-имя функции (второе имя). Можно объявить такой указатель с помощью TYPEDEF: typedef double (*pf)(double x);
Операции с указателями на функции:
Объявление
Присваивание
Можно передавать как формальный параметр в другую функцию
Можно вызывать функцию указателем
Можно создать массив указателей
Пример вызова указателем: (*pf1)(2); - при этом указатель разыменовывается.
! Нетипизированных указателей на функции нет.
Пример применения: универсальное табулирование (вывод таблицы квадратов или кубов чисел).
Билет 44. Типичные ошибки при работе с массивами
В основном все ошибки с массивами связаны с указателями или индексами.
В случае вложенных циклов часто во внутреннем цикле пишут индекс внешнего, в итоге двумерный массив (или многомерный) обрабатывается только по диагонали. Для избежания этой ошибки в С99 индексы объявляются в соответствующем for.
Использование просто не того индекса или введение индекса, имя которого совпадает с именем какой-либо переменной (как так можно ошибиться я лично не представляю, но Козин сказал, что можно)
Индекс/итератор вышел за рамки массива (т.е. за начало или за конец более, чем на одну позицию или на одну, но мы попытались его разыменовать). Чтобы избежать такую ошибку, надо тщательно проверять условия перемещения по массиву (тем же инвариантом, описанным в последнем билете)
Использование некорректного указателя (в случае массивов это значит, что мы либо забыли указатель определить, либо уже освободили память, но все-равно пытаемся массив прочитать, иных вариантов я не вижу)
Билет 45. Массив указателей, динамическая матрица
Динамическая матрица - это массив указателей, каждый из которых указывает на свою строку. Используется для заменения работы со строками работой с указателями. Т.е. чтобы, к примеру, поменять местами 2 строки, достаточно поменять значения указателей на эти строки в массиве, что намного проще и быстрее. !сами строки не меняются, перемещаются только указатели.
Для того, чтобы работать с динамическими массивами, необходимо перед началом работы выделить память под такой массив, а после использования массива освободить выделенную память.
1. Выделение памяти
double **p=(double**)malloc(sizeof(double*)*row); //выделяем row ячеек для массива указателей, где row
//– количество строк, притом double* - место для записи указателя на строку типа double
for(int i=0;i<row;i++) //в цикле выделяем память для каждой строки, устанавливаем на нее //соответствующий указатель
{p[i]=(double*)malloc(sizeof(double)*col);}
2. Очищение памяти
!Внимание! Память надо освобождать обязательно и в обратном выделению порядке. Иначе будете вечно страдать от переполнения стэка. После освобождения памяти с помощью freem освобожденными переменными/массивом указателей пользоваться нельзя, надо снова выделять память.
for(int i=0;i<row;i++)
{free(p[i]);}
free(p);
Ответы на возможные вопросы:
квази-имя – «второе» имя, в случае программирования – еще одно имя, с помощью которого можно получить доступ к данной памяти
если необходимо поменять местами не строки, а элементы или столбцы, то изменяем строки, как и при работе с обычными массивами
Общая модель массива указателей:
0 иван\0
1 демьян\0
2 никита\0
…