Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

Передача массивов в качестве параметров

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

:

#include <iostream.h>int sum(const int* mas, const int n);int const n = 10;void main(){ int marks[n]={3, 4, 5, 4, 4}; cout << "Сумма элементов массива: " << sum(marks, n);}int sum(const int* mas, const int n) /*варианты: int sum(int mas[], int n) или int sum(int mas[n], int n) (n должна быть константой) */{int s = 0; for (int i = 0; i<n; i++) s += mas[i]; return s;}

При передаче многомерных массивов все размерности, если они не известны на этапе компиляции, должны передаваться в качестве параметров.

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

#include <stdio.h>int sum(const int *a, const int nstr, const int nstb);void main(){ int b[2][2] = {{2, 2}, {4, 3}}; printf("b %d ", sum(&b[0][0], 2, 2)); /* имя массива передавать нельзя из-за несоответствия типов */ int i, j, nstr, nstb, *a; printf("Введите количество строк и столбцов: "); scanf("%d%d", &nstr, &nstb); a = (int *)malloc(nstr*nstb*sizeof(int)); for (i = 0; i<nstr; i++) for (j = 0; j<nstb; j++)scanf("%d", &a[i*nstb+j]); printf("a %d ", sum(a, nstr, nstb));}int sum(const int *a, const int nstr, const int nstb){int i, j, s = 0; for (i = 0; i<nstr; i++) for (j = 0; j<nstb; j++)s += a[i*nstb + j]; return s;}

Для того чтобы работать с двумерным массивом естественным образом, можно применить альтернативный способ выделения памяти:

#include <iostream.h>int sum(const int **a, const int nstr, const int nstb);void main(){int nstr, nstb; cin >> nstr >> nstb; int **a; a = new int* [nstr]; for (int i = 0; i<nstr; i++) a[i] = new int [nstb]; /*... формирование матрицы a */ cout << sum(a, nstr, nstb);}int sum(const int **a, const int nstr, const int nstb){int i, j, s = 0; for (i = 0; i<nstr; i++) for (j = 0; j<nstb; j++)s += a[i][j]; return s;}

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

Функцию можно вызвать через указатель на нее. Для этого объявляется указатель соответствующего типа и ему с помощью операции взятия адреса присваивается адрес функции:

void f(int a){ /*... */ }//определение функцииvoid (*pf)(int);//указатель на функцию...pf = &f;/* указателю присваивается адрес функции (можно написать pf = f;) */pf(10);/* функция f вызывается через указатель pf (можно написать (*pf)(10)) */

Для того чтобы сделать программу более читаемой, при описании указателей на функции используют переименование типов (typedef). Можно объявлять массивы указателей на функции (это может быть полезно, например, при реализации меню):

typedef void (*Pf)(int);/* описание типа PF как указателя на функцию с одним параметром типа int */PF menu[]={&new, &open, &save}/* описание и инициализация массива указателей */menu[1](10);//вызов функции open

Указатели на функции передаются в подпрограмму таким же образом, как и параметры других типов:

void fun(PF pf)/* функция fun получает в качестве параметра указатель типа PF */{... pf(10);...}//вызов функции, переданной через указатель

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

<== предыдущая лекция | следующая лекция ==>
Концептуальные уровни в познании веществ и химические системы | Открытие потока
Поделиться с друзьями:


Дата добавления: 2014-01-14; Просмотров: 285; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.