Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_Информатика.doc
Скачиваний:
1
Добавлен:
16.09.2019
Размер:
143.36 Кб
Скачать

1.2.5 Перегрузка функций

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

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

Пример:

long max (int n, int mas)

{

int maxN=mas[0];

for(int i=0;i<n;i++)

if(mas[i]>maxN)maxn=mas[i];

return maxN;

}

long max (int n, long mas)

{

long maxN=mas[0];

for(int i=0;i<n;i++)

if(mas[i]>maxN)maxn=mas[i];

return maxN;

}

1.2.6 Передача функций в качестве параметров

Функции могут передаваться в качестве параметров. Фактически передаваемое значение является адресом функции.

Адреса функции передаем через указатели на функции. Указатель на функцию определяется следующим образом:

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

Например,

int (*funPtr)(char) – определение указателя funPtr на функцию с параметром типа char, возвращающую значение типа int.

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

Оператор адреса функции в указатель:

имя указателя = имя функции;

Оператор вызова функции с помощью указателя на функцию:

(*имя_указателя)(список фактических параметров);

Пример:

void f1(void)

{

print(“Выполняется f1”);

}

void f2(void)

{

print(“Выполняется f2”);

}

void main()

{

void (*ptr)(void); - определение указателя на функцию

ptr=f2; - присваивание адреса функции f2() указателю ptr

(*ptr)(); - вызов функции f2() с помощью указателя ptr

ptr=f1; - присваивание адреса функции f1() указателю ptr

(*ptr)(); - вызов функции f1() с помощью указателя ptr

}

1.3 Структуры

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

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

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

struct {

список описаний элементов}

Например,

struct{

int a;

float b;

}

В структуре должен быть обязательно указан хотя бы один элемент.

С типом структуры можно ассоциировать имя. Это можно делать при помощи меток.

struct метка {

список элементов;

};

Метка – это и есть имя. И тогда к структуре можно обращаться через это имя.

Например, опишем структуру так,

struct student

{

char name[25];

int id, age;

char sex;

};

Это шаблон, который только описывает структуру. Для выделения памяти для структуры, необходимо описать сам структурный объект. Это описание может быть задано следующим образом:

  1. struct {

список описаний элементов} имя объекта;

Пример:

struct {

float a;

int b;

} r, t[10];

  1. С использованием меток

struct метка

{

список описаний элементов;

} имя объекта 1, имя объекта 2;

Или

struct метка

{

список описаний элементов;

};

struct метка имя объекта 1, имя объекта 2;

Пример:

struct student

{

char name[25];

int age;

char sex;

}s, t[5];

Или

struct student

{

char name[25];

int age;

char sex;

};

struct student s, t[5];

Список элементов, заключаемый в { }, называется полями структуры. Доступ к отдельному полю осуществляется с помощью следующей записи:

name . title

/ \

имя структурной переменной имя поля

Пример:

struct student

{

char name[25];

int age;

char sex;

};

struct student s, t[5];

Тогда присвоить значение элементу структуры можно так

s.age=5;

Указатели и структуры

Рассмотрим на примере.

Введем структуру:

struct student

{

char name[25];

int age;

char sex;

};

Введем указатель типа student:

struct student *new_student;

Предположим что была выделена память под объект на который указывает данный указатель. Тогда на компоненты данного объекта можно ссылаться:

(*new_student).name;

(*new_student).age;

Вместо такого обращения можно использовать:

new_student - > age;