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

Void funk(“Kozin”); - при этом ничего не возвращается. Данная запись используется довольно редко.

Билет 50. Массивы строк

Массив строк – это двумерный массив типа char, у которого в каждой строке есть символ \0. Это может быть как обычный массив, так и динамическая матрица.

Пример:

Static char massiv [3] [8]= {“Ivanov”

“Petrov”

“Sidorov”}

Работа с массивом строк в С такая же, как и с двумерным массивом, динамической матрицей, строками. Точнее, она объединяет в себе эти типы работ. (повторяться не буду, нужная информация по работе уже описана в соответствующих билетах).

Билет 51. Работа с динамической памятью

Преимущества динамической памяти в том, что программист может оптимизировать расход памяти, выделяя память без запаса, а так же выиграть время, отведённое на выделение памяти. В совокупности это увеличивает производительность программы. Позволяет работать с динамическими объектами.

Как минус работы в С: необходимо все время следить за удалением памяти, т.к. стек не резиновый, а очищающей программы в С, в отличие от некоторых других языков, нету =(.

Стандартные функции для работы с динамической памятью в «си»:

#include <stdlib.h>

Выделяют память

void *malloc(size_t size); //описана в билете о массиве указателей

void *calloc(size_t row, size_t size); //возвращает указатель на двумерный массив (выделяется память под массив объектов, каждый из которых размером size, притом количество объектов в массиве - row)

void *realloc(void *p, size_t size); //изменяет размер выделенной памяти

Освобождает память

void free(void *); //описана в билете о массиве указателей

! void* не означает, что ничего не передается, это нетипизированый указатель

! нельзя освободить освобожденную или невыделенную память

! нельзя использовать уже освобожденный указатель

Билет 52. Организация динамического одномерного массива

Впрочем, вопрос содержит билеты № 45 и 51. Чтобы организовать динамический одномерный массив, необходимо объявить указатель нужного типа, выделить память под массив с помощью malloc, изменять размер памяти, если это необходимо (лучше при расширении выделять большой блок памяти, скажем, в 2 раза больше, чем был, т.к. подобные операции требуют много времени), а затем !обязательно эту память освободить с помощью freem.

Изменять размеры можно двумя способами: либо функцией realloc (по своему опыту скажу, довольно геморная функция в плане разобраться с ней), либо выделять новую память, копировать туда данные и стирать старую. Козину лучше выдать второй вариант, если спросит про какой-нить другой способ, только тогда упомянуть имя функции realloc.

Билет 53. Структуры. Определение типа структур. Определение переменных в структуре и инициализация. Операции со структурой

Язык С предоставляет программисту возможность организации переменных не только по типу (массивы), но и по любому критерию. Таким объединением является структура – форма представления данных различных типов. !структура объединяет логически связанные данные.

Структура состоит из 3 частей: заголовок, поля, объявление с именем переменной.

! описывать структуру можно как вне тела main, так и внутри.

Пример:

struct Books

{

char title[20];

char author[20];

} book;

Struct Books – заголовок (объявлениеструктуры), { … } – поляструктуры, book – переменнаятипа Books.

Объявление book можно опустить. Объявить переменную типа Books можно в main: struct Books book; - это равносильно объявлению в конце описания.

Инициализация структур похожа на инициализацию массива.

Пример: struct Books book = {“TITLE”, “AUTHOR”}; (притом такая инициализация вне объявления у меня лично не сработала, может это свойство стандарта С89, но все же)

Инициализация переменных происходит в строгой последовательности, т.е. первому полю в структуре будет соответствовать первый инициализатор (“TITLE”), второму – второй и так далее.

Стандарт С99 расширяет возможности инициализации структуры и стирает это ограничение. Теперь инициализация может быть произведена в следующей форме: struct Books book = {.author = “Kozin”, .title = “C for dummies”};.

Всего 3 варианта инициализации:

Без инициализаторов

Последовательная запись инициализаторов

Запись непосредственно в поля в любой последовательности

Обращение к полю структуры записывается как: book.author. Название структуры соответствует типу переменной, т.е. работать со структурой в общем можно как с переменной. Её можно передавать в функцию целиком, возвращать через ретурн или указатель. Можно присвоить значение одной структуры другой, притом произойдет копирование из одной структуры в другую.

Примеробъявленияфункции:

struct Books copy(struct Books *book)

{

struct Books book1={" ","AUTHOR"};

*book=book1;

return book1;

}

В данном случае мы передаем указатель на структуру бук. В функции определяем и записываем структуру бук1. Копируем созданную структуру в бук. !Возвращаются и бук, и бук1, только бук1 возвращаем через ретурн, а бук само запишется через указатель.

!!С полями структуры также можно выполнять операции как с переменными того же типа(или массивами, если полем структуры является массив)

!!Полем структуры может быть другая структура

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