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

    f(&ivar);   // Передача адреса ivar 

    Внутри функции выражение *ip = 1234; присваивает значение 1234 переменной 
ivar, адрес которой передается функции f(). Теперь рассмотрим аналогичную 
функцию, использующую ссылочные параметры: 

    void f(int &ir) 
    ir = 1234; 

    Указатель ip заменен ссылкой ir, которой функция присваивает 1234. Выражение 

    f(ivar);   // Передача ivar по ссылке 

присваивает значение ссылочному объекту: передает ivar no ссылке функции 
f(), и поскольку ir ссылается на ivar, то ivar присваивается 1234. 

    Ссылки в качестве результатов функций 

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

    double &ref(double d); 

необходим один вещественный аргумент двойной точности, и она возвращает 
ссылку на объект того же типа, предположительно объявленный где-то в другом месте. 
    Листинг 12.17 демонстрирует использование ссылочных функций для скрытия 
внутреннего представления структуры данных. Это используется при реализации 
больших проектов, особенно когда структуры данных могут изменяться, что, в 
свою очередь, может послужить причиной коренной переделки программ, написанных 
на обычном ANSI С. Ссылочные функции в C++ могут облегчить этот рутинный 
процесс, обеспечив доступ к структурам данных, подобным массивам, без привязки 
кода к физическим свойствам данных. Скомпилируйте и запустите программу, по 
приглашению введите индексное значение от 0 до 9, затем — вещественное 
значение. Для завершения работы программы нажмите по приглашению <Enter>. 

    Листинг 12.17.   REFFUNC.CPP (ссылочные функции)

    1:	&include <iostream.h> 
    2:	&include <stdlib.h> 
    3:	&include <string.h> 
    5:	&define FALSE 0 
    6:	&define TRUE 1 
    7:	&define SIZE 10 
    8:	&define BUFLEN 20 
    9: 
    10:	double &ref(int index); 
    11:	void ShowArray(void); 12: 
    13:	double array[SIZE]; 14: 
    15:	main() 
    16:	{ 
    17:	int done = FALSE, index; 
    18:	char buffer[BUFLEN]; 
    19: 
    20:	for (index = 0; index < SIZE; index++) 
    21:	   ref(index) = index; // Присваивание ссылочной функции! 
    22:	while (Idone) { 
    23:	  ShowArray(); 
    24:	  cout « "\nEnter index from 0 to 9, Enter to quit:"; 
    25:	  cin.getline(buffer, BUFLEN); 
    26:	  done = (strlen(buffer) ==0); 
    27:	  if (Idone) { 
    28:	    index = atoi(buffer); 
    29:	    cout « "Enter floating-point value:"; 
    30:	    cin,getline(buffer, BUFLEN); 
    31:	    ref(index) = atof(buffer); 
    32:	  } 
    33:	} 
    34:	return 0; 
    35:	} 


    Глава 12. Введение в C++     301 
