Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_cpp.doc
Скачиваний:
10
Добавлен:
07.06.2015
Размер:
2.81 Mб
Скачать

Указатели как параметры функции

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

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

  1. Указатели на простые типы данных, как параметры функции.

  2. Указатели на массивы (передавать по значению нельзя).

  3. Указатели на перечислимые типы как параметры функции.

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

  5. Указатели на функции (передавать по значению нельзя).

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

тип_возвращаемого_значения (*имя_указателя_на_функцию) (объявления_типов_параметров);

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

Инициализация указателя на функцию:

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

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

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

Пример

int linescarch (int)*pstring //объявление функции linesearch (int* )

voild main()

{int a; * pstr = “Hello World!”; // объявление переменной и указателя pstr на тип int

int (*search)(int*); // объявление указателя на функцию

search= linesearch; // присваиваем адрес функции linesearch ()указателю search

//другие операторы

a = (* search)(pstr); // вызов функции linesearch ( ) с помощью указателя.

}

Пример

/* ЗАНЯТИЕ N 16

Разработал Петров Ю.В.

Объявить заданные функции и указатель на функцию этого типа,

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

на них, выполнить инициализацию в соответствии с заданными

зависимостями и использованием указателей. Для одного из

массивов выделить память в куче. Вывести значения элементов

массивов на экран. Осуществить вызов функций с применением

указателя. Вывести результаты работы функций на экран. */

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <iostream.h>

const int kx = 6, ky = 6, kw = 8, a1 = 3, a2 = 9,

b1 = 6, b2 = 5, c1 = 6, c2 = 10;

//Вычисляет сумму отрицательных элементов массива

float summa ( int, float* );

//Вычисляет произведение положительных элементов массива

float prois ( int, float* );

float (*ps)( int, float* ); //Объявление указателя на функцию

void main ()

{

int i;

float y[ky+2]; //+2 элемента массива для хранения

// результатов работы функций

float *px=new float [kx+2];//Выделение памяти для массива в "куче"

float *xptr;

clrscr();

printf("Массив x[]\n");

for ( i=0; i<kx; i++)

{ *px = a1*i*i - a2*(5-i); //Инициализация динамического массива

printf("x[%d] = %6.2f %p \n",i, *px, px);

px++;

}

xptr = y;

gotoxy(25,1); printf("Массив y[]\n");

for ( i=0; i<ky; i++)

{ *xptr = b1*sin(2*i) + b2*exp(i-5); //Инициализация массива y[]

gotoxy(30,i+2);

printf("y[%d] = %6.2f\n",i,*xptr);

xptr++;

}

px-=kx; //Установка указателя на нулевой элемент массива

printf("Указатель на дин. массив содержит адрес рx = %p\n ", px );

ps=summa; //Связывание указателя с функцией summa()

printf("Указатель на функцию содержит адрес рs = %p\n ", ps );

printf("Сумма: x[%d] = %6.2f ", kx, (*ps)(kx, px) );

printf("Сумма: y[%d] = %6.2f\n ", ky, (*ps)(ky, y) );

ps=prois; //Связывание указателя с функцией prois()

printf("Указатель на функцию содержит адрес рs = %p\n ", ps );

printf("Произведение: x[%d] = %8.2f ", kx+1, (*ps)(kx, px) );

printf("Произведение: y[%d] = %8.2f\n ", ky+1, (*ps)(ky, y) );

delete [] px; //Освобождение памяти, выделенной в "куче"для массива

getch();

}

float summa ( int kol, float* Arr ) //Определение функции

{ float s=0;

for ( int i=0; i<kol; i++ ) if (Arr[i]<0) s+=Arr[i];

return s;

}

float prois ( int kol, float* Arr ) //Определение функции

{ float s=1;

for ( int i=0; i<kol; i++ ) if (Arr[i]>0) s*=Arr[i];

return s;

}

/*

Массив x[] Массив y[]

x[0] = -45.00 0AD0 y[0] = 0.03

x[1] = -33.00 0AD4 y[1] = 5.55

x[2] = -15.00 0AD8 y[2] = -4.29

x[3] = 9.00 0ADC y[3] = -1.00

x[4] = 39.00 0AE0 y[4] = 7.78

x[5] = 75.00 0AE4 y[5] = 1.74

Указатель на дин. массив содержит адрес рx = 0AD0

Указатель на функцию содержит адрес рs = 049C

Сумма: x[6] = -93.00 Сумма: y[6] = -5.29

Указатель на функцию содержит адрес рs = 04F3

Произведение: x[7] = 26325.00 Произведение: y[7] = 2.52 */

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