Разновидности указателей в С ++. Замечания о работе менеджера кучи в С++. Ссылки, структуры и объединения, страница 3

            Указатель  funcptr на функцию, которая имеет параметр типа char и возвращает значение типа int. При использовании имент функции без последующих скобок и параметров имя функции выступает в качестве указателя на эту функцию, и его значением служит адрес размещения функции в памяти.

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

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

# include < iost ream.h>

int add (int n, int m) {return n + m;}

int subt (int n,int m ) {return n – m;}

int mult (int n, int m) {return n * m;}

int result (int a,int b, char c)

{

 int (*p)(int, int);

 switch ( c )

 {

  case '+' : p = add; break;

  case '–' : p = subt; break;

  case '*' : p = mult; break;

 }

 return ((*p) (a,b));

}

void main ( )

{

 int x,y; char ch;

 cout << " \n  введите знак ";  cin >> ch;

 while (ch!=' ')

 {

  cout << "\n введите числа";  cin >> x >> y;

  cout << result (x,y,ch);

  cout << " \n  введите знак ";  cin >> ch;

 }

}

Ссылки

            В С++ ссылка определяется как другое имя  уже существующего объекта.

тип & имя_ссылки инициализатор;

int L = 77;

int & RL = L;

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

Наиболее широко ссылки используются в качестве параметров функции, если из функции требуется возвратить более, чем одно значение.

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

//  Обмен значений двух переменных  с помощью указателей

void swap1 (double * x, double * y)

{

 double c = * x; *x = * y; * y = c;

}

//  Обмен значений двух переменных  с помощью ссылок

void swap2 (double &x, double &y)

{

 double c = x; x = y; y = c;

}

void main ()

{

 double d = 1.23, l = 4.56;

 swap1 (&d, &l); swap2 (d,l);

}

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

/* Функция определяет ссылку на элемент с максимальным значением в массиве, массив с переменным количеством параметров */

int& rmax ( int n, int d [ ])

{

 int m = 0;

 for (int i=1;i<n;i++) m= d[m]>d[i] ? m : i;

 return d [m];

}

void main ( )

{

 int n=4;int x[]={10,40,30,20}; cout << rmax (n,x);

 rmax(n,x)=110; for (int i=0;i<n;i++) cout << x[i];

}

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

Структуры

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

// Структура библиографической карточки:

struct card

{

 char * author;

 char * title;

 …

 int pages;

}

// Объявление структурированных объектов

сard rec1, rec2;

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

имя_структуры. имя _атрибута;

            Структуру можно проинициализовать

card rec1 = { "…", "…",…,550};

            Определение структуры может быть совмещено с объявлением объектов, имеющих данный структурированный тип