Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie_i_chislennye_metody_Voprosy.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
146.43 Кб
Скачать
  1. Покажчики на функції. Покажчики і аргументи функцій.

В языке Си допускаются указатели не только на данные, но и на функции. Они позволяют, например, создать функцию, строящую таблицу значений любой другой функции (с заданным видом списка параметров); при этом конкретный вызов этой другой функции осуществляется через указатель на функцию.

Рассмотрим методику работы с указателями на функции.

1. Как и любой объект языка Си, указатель на функции необходимо декларировать. Формат объявления указателя на функции следующий:

тип (*переменная-указатель)(список параметров);

т.е. декларируется указатель, который можно устанавливать на функции, возвращающие результат указанного типа и которые имеют указанный список параметров. Наличие первых круглых скобок обязательно, так как без них – это декларация функции, которая возвращает указатель.

Например, объявление вида:

double (*p_f )(char, double);

говорит о том, что декларируется указатель p_f, который можно устанавливать на функции, возвращающие результат типа double и имеющие два параметра: первый – символьного типа, а второй – вещественного типа.

2. Идентификатор функции считается константным указателем, поэтому для того, чтобы установить переменную-указатель на конкретную функцию, достаточно ей присвоить ее идентификатор:

переменная-указатель = ID_функции;

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

При передаче по адресу в стек заносятся копии адресов аргументов, а функция осуществляет доступ к ячейкам памяти по этим адресам и может изменить исходные значения аргументов. Для обращения к значению аргумента-оригинала используется операция «*».

Пример функции, в которой меняются местами значения x и y:

void zam(int *x, int *y)

{

int t = *x;

*x = *y;

*y = t;

}

  1. Покажчики та багатовимірні масиви. Ініціалізація масивів покажчиків.

Указатели, как и переменные любого другого типа, могут объединяться в массивы. Объявление массива указателей на целые числа имеет вид:

int *b[10], y;

Теперь каждому из элементов массива можно присвоить адрес целочи­сленной переменной y, например: b[1]=&y;

Чтобы теперь найти значение переменной y через данный элемент массива а, необходимо записать *b[1].

  1. Описання покажчиків. Описання та використання покажчиків на функції.

См. вопрос 19

  1. Що таке "породжені типи даних"?

Порожденные типы данных – структуры и объекты.

  1. Структури і функції. Призначення структур.

Структуры – это объединенные в единое целое множество элементов данных.

Структура это составной объект языка Си, представляющий собой совокупность логически связанных данных различных типов, объединенных в группу под одним идентификатором. Данные, входящие в эту группу, называют полями.

  1. Опис структури. Шаблони та екземпляри структур. Коли відбувається розподілення пам'яті під структри

Определение объектов типа структуры производится за два шага:

– декларация структурного типа данных, не приводящая к выделению участка памяти;

– определение структурных переменных объявленного структурного типа с выделением для них памяти.

Структурный тип данных задается в виде шаблона, общий формат описания которого следующий:

struct ID структурного типа

{

описание полей

};

Атрибут «ID структурного типа», т.е. ее идентификатор является необязательным и может отсутствовать.

Описание полей производится обычным способом: указываются типы и идентификаторы.

Пример определения структурного типа:

Необходимо создать шаблон, описывающий информацию о студенте: номер группы, ФИО и средний балл. Один из возможных вариантов:

struct Stud_type {

char Number[10];

char Fio[40];

double S_b;

};

Само описание структуры не приводит к выделению под нее места в ОП. Теперь необходимо создать нужное количество переменных с приведенной структурой и сделать это можно двумя способами.

Способ 1. В любом месте программы для декларации структурных переменных, массивов, функций и т.д., используется объявленный в шаблоне структурный тип, например:

struct Stud_type student; - структурная переменная;

Stud_type Stud[100]; - массив структур;

int Fun(Stud_type W); - прототип функции с параметром стру­ктур­ного типа,

(Слово struct в первом примере является необязательным, и в остальных примерах оно опущено).

Способ 2: в шаблоне структуры между закрывающейся фигурной скобкой и символом «;» указывают через запятые идентификаторы структурных данных.

Для нашего примера, используя, можно записать:

struct Stud_type {

char Number[10], Fio[40];

double S_b;

} student, Stud[100];

Если дальше в программе не понадобится вводить новые данные объявленного структурного типа, имя типа «Stud_type» можно не указывать.