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

Билет 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

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