Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++ / Лекция 9.doc
Скачиваний:
101
Добавлен:
02.04.2015
Размер:
110.59 Кб
Скачать

Пример. Сумма элементов массива

Передается указатель на массив и число элементов массива

int sum(const int *mas, const int n);// прототип функции

const int n=10;

int main( ) // главная функция

{

int marks[n]={1,2,3,4,5};//частичная инициализация массива

cout<<”Сумма элементов массива”<<sum(marks, n);

// имя массива является адресом массива

return 0;

}

int sum(const int *mas,const int n)

{

int s=0;

for (int i=0;i<n;i++) s+=mas[i];

return s;

}

Пример 2. Значения массива изменяются в функции

const int k=5;

int mas[k]={0,0,0,0,0};

void f(const int k, int *mas1);

int main( )

{

f(k,mas);

for (int i=0;i<k;i++) cout<<mas[i]<<endl;

getch();

return 0;

}

void f(const int k,int *mas1)

{

for (int i=0;i<k;i++) mas1[i]=mas1[i]+i*i;

return;

}

Передача структур функциям

  • При передаче структуры в качестве аргумента используется механизм передачи параметров по значению

  • Любые изменения, внесенные в содержимое объекта структуры, не влияют на структуру, используемую в качестве аргумента

Пример

// Определение структуры

struct sample {

int a;

char ch;

} ;

void f1(sample parm); // прототип функции

int main()

{

struct sample arg; // объявление объекта структуры arg

arg.a = 1000;

arg.ch = 'X';

f1(arg);

return 0;

}

void f1(sample parm)

{

cout << parm.a << " " << parm.ch;

cout << "\n";

}

Cсылки на структуру

#include <iostream.h>

#include <conio.h>

struct my // описание структуры

{

int a,b;

}zzz;

my u;

void f(my ii, my &u) // передача параметров : ii –по значению

// u - по ссылке

{

u.a=ii.a+10;

u.b=ii.b+20;

}

int main( )

{

zzz.a=2;

zzz.b=5;

f(zzz, u);// вызов функции

cout<<u.a<<endl;

cout<<u.b<<endl;

getch();

return 0;

}

Указатель на функцию

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

  • Над указателями на функцию запрещены арифметические операции

  • Указатель на функцию используется, если необходимо передать функцию как параметр другой функции

Общий вид указателя на функцию

тип (*pfunc) (тип1 параметр1,…,тип N параметрN)

pfunc – указатель

тип – тип, возвращаемый функцией, на которую указывает pfunc

тип1,…,типN – типы параметров функции

Пример

double f (double x);

double f1 (double x); //прототипы функций

double f2 (double x);

double ff (double (*pf) (double x));//указатель на функцию pf в качестве

//аргумента функции

double f (double x)

{

return x;

}

double f1 (double x)

{

return x*x;

}

double f2 (double x)

{

return x*x*x;

}

double ff (double (*pf) (double x))

{

return pf(3); // передача параметров осуществляется в теле функции

}

int main( )

{

double z=1.5,y;

double (*ptrf)(double x); // создание указателя на функцию

ptrf=f; //инициализация указателя- присвоение адреса функции f( )

y=(*ptrf)(z); // вызов функции f( ) через указатель(первый способ)

cout<<z<<" "<<y<<endl; // 1.5 1.5

y=ptrf(z); // вызов функции f( ) через указатель(второй способ)

cout<<z<<" "<<y<<endl; // 1.5 1.5

ptrf=sin;//инициализация указателя- присвоение адреса стандартной

// библиотечной функции sin

y=ptrf(z); // вызов функции через указатель(второй способ)

cout<<z<<" "<<y<<endl; // 1.5 0.997495

y=(*ptrf)(M_PI / 6.0); // вызов функции для вычисления sin (π/6)

//(первый способ)

cout<<z<<" "<<y<<endl; // 1.5 0.5

y=ff(f1); //вызов функции ff ( параметр - функция f1)

cout<< y<<endl; // 3*3=9

y=ff(f2); //вызов функции ff ( параметр - функция f2)

cout<< y<<endl; // 3*3*3=27

y=ff(cos);//вызов функции ff ( параметр- стандартная

// библиотечная cos

cout<< y<<endl; // -0,989992

y=ff(ptrf); //вызов функции ff ( параметр- стандартная

// библиотечная sin

cout<< y<<endl; //0.14112

getch();

return 0;

}