Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_otvyty.docx
Скачиваний:
2
Добавлен:
04.08.2019
Размер:
100.42 Кб
Скачать

Билет 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]);.

Также мы можем передать строку не как переменную, а напрямую:

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