- •Оглавление
- •Билет 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 начало_отсчета);
Билет 46. Понятие некорректного указателя.
Некорректными являются те указатели, которые нельзя использовать для работы с памятью и выполнения над ними операции разыменования. К таким указателям относятся:
неинициализированный указатель (он содержит мусор)
int main (void)
{ int x, *p;
x = 10;
*p=x;
return 0; } //программа при компиляции ошибок не выдаст, но при запуске в лучшем случае вылетит, как //было у меня, в худшем – запишет неведомо куда и молитесь, чтоб это была не область windows
указатель на -1 элемент массива (т.е. если при передвижении указателя мы вылезли раньше начала массива)
int main(void)
{ int x[10]={0}, *p;
p=x;
p--;
printf("%d",*p);
return 0; } //программа сработает, но на экране будет мусор и указатель будет установлен на неизвестную //область памяти, впрочем указатель можно вернуть обратно операцией ++
Указатель, вышедший за конец массива можно считать верным, если это неограниченный массив (туда можно будет дозаписать, расширив память под массив). Считать его верным или нет в других случаях – спорный вопрос. Я лично не считаю, т.к. он указывает на невыделенную память.
указатель, вылезший за пределы файла (притом, если вылез на 1 за конец, еще ничего страшного, его можно применить скажем, для записи, в иных случаях он нам только белиберду может выдать)
указатель на память, очищенную с помощью функции freem (он считается неинициализированным, т.к. эту память уже могли занять другие программы)
Билет 47. Организация строк. Общие сведения
Строка в языке С – это массив символов, содержащий символ конца строки (“\0”).
char ID [N];
ID - идентификатор массива, N- длина массива, при этом в памяти для строки выделяется N байт. Например, для переменной char ST [10] в памяти выделяется 10 байт, что дает возможность сформировать строку из 9 символов (один идет на символ конца строки). Для таких строк действуют все правила представления и обработки массивов.
Инициализация возможна двумя способами:
как обычный массив: посимвольная инициализация char st[10] = {'у', ' е','s', '\0'}; при этом оставшиеся 6 позиций не будут заполнены;
инициализация на основе строковой константы char st [10] = " Yes"; при этом в выделенную для строки память будут помещены 3 символа и добавлен четвертый - символ « \ 0», оставшиеся позиции также не будут заполнены.
Инициализация и объявление возможны без указания длины char st[] = {‘у', 'е', 's' , '\0'}; в этом случае будет создан массив из четырех элементов. А также проинициализировать можно просто символом \0.
Билет 48. Ввод/вывод строк
Ввод символьных строк с клавиатуры в языке С осуществляется : мощью функций scanf (), gets () и fgets(), объявленных в заголовочном файле stdio.h. При работе с этими функциями следует помнить, что для строк предварительно должна быть выделена память. Конечный нуль добавляется после завершения ввода строки автоматически.
Ввод строк:
scanf ("%Ns", SI) ; где SI - указатель типа char* на предварительно выделенную область. При использовании формата %s аргумент рассматривается как строка. Ввод строки реализуется до пробела, нажатия [Enter] или после чтения N символов (впрочем, N можно не писать, тогда читать будет сколько угодно символов до пробела или ентер). Несколько слов вводить в одну переменную с помощью scanf нельзя. !Перед SI не надо ставить &, это не будет ошибкой, но зачем делать лишнее, если можно обойтись без него;
gets (SI) ; при помощи этой функции можно вводить любую строку, не ограничивает ввод. Ввод прекращается при нажатии [Enter] или EOF(символ конца файла, в винде вводится как ctrl+z). После ввода символ новой строки автоматом заменяет на символ \0. !нельзя использовать в коммерческом коде, так как она используется хакерами для переполнения буфера.
fgets(SI, N, stdin) ; читает N-1 символов. Функция изначаль создана для работу с файлами, но С представляет внешние устройства как файлы, т.е. stdin указывает на то, что читаем из буфера клавиатуры (если надо читать из файла, то вместо него пишем указатель на файл). Не заменяет символ новой строки. Если все прошло успешно, возвращает как и gets указатель на строку, иначе нулл.
Вывод строк:
printf (“%Ns", SI) ; в отличие от scanf выводит абсолютно любую строку
puts (SI) ; заменяет при выводе \n на \0
fputs (SI, stdout); возвращает, как и puts, при успехе указатель, иначе нулл. Действует аналогично fgets, только на вывод
Вывод строки продолжается до символа ‘ \0 ‘.
Билет 49. Строковые переменные. Использование строк в качестве параметров
Все основное про строки описано в билете 47. Теперь про их использование.
Строки в функцию передаются как указатели на нулевой элемент одномерного массива.
Пример: void funk(char *str); - при вызове этой функции мы передадим имя строки, т.к. имя строки является указателем, то функция вернет через него новое значение строки. Аналогичной является запись void funk(char str[20]);.
Также мы можем передать строку не как переменную, а напрямую: