    4:	{ 
    5:	int ivar = 1234;	// Переменной присвоено значение 
    6:	int *iptr = &ivar	;    // Указателю присвоен адрес ivar 
    7:	int &iref = ivar;	// Ссылка ассоциирована с ivar 
    8:	int *p = &iref;	// Указателю присвоен адрес iref 
    9: 
    10:	cout « "ivar ==	" « ivar « '\n' ; 
    11:	cout « "*iptr ==	" « *iptr « '\n' ; 
    12:	cout « "iref ==	" « iref « '\n'; 
    13:	cout « "*p == "	« *p « '\n' ; 
    14:	return 0; 
    15:	} 

    В строках 5-8 объявляются четыре переменные. Первая — простое целое ivar, 
инициализированное значением 1234. Следующая. — указатель на целое с именем 
iptr, которой присвоен адрес ivar. Третья объявлена как ссылочная переменная. Строка 

    int &iref = ivar; 

объявляет iref как ссылку на целое значение. Что касается iref, то ей 
присваивается ivar не как значение переменной, а как адрес в памяти. Следуя 
объявлению, iref указывает на ivar подобно указателю. Как показано в строке 
12, оператор 

    cout « "iref == " « iref « '\n'; 

выводит значение ivar — 1234. Это происходит благодаря использованию iref 
в качестве ссылки на местоположение переменной ivar в памяти. 
    Четвертое объявление в строке 8 создает еще один указатель — р, которому 
присваивается адрес, хранящийся в iref. Строки 6 и 8 дают одинаковый 
результат. В обеих строках создаются указатели, ссылающиеся на ivar. Как 
показано в строке 13, употребление указателя в выражении *р дает доступ к 
значению ivar. На рис. 12.2 проиллюстрирована взаимосвязь переменных из 
листинга 12.15. Как видно из иллюстрации, использование iref очень похоже на 
использование разыменования указателя *р. В обоих выражениях осуществляется 
доступ к значению ivar — 1234 


    Рис. 12.2. Взаимосвязь переменных в листинге 12.15, REFVALCPP 


    При использовании ссылок следует помнить одно правило: однажды 
инициализировав ссылку, ей нельзя присвоить другое значение. В REFVAL.CPP вы 
не можете объявить новую целочисленную переменную и присвоить ее адрес iref: 

    int anotherlnt;        
    iref = anotherlnt;       // ??? 

    Это присваивание не заставит iref ссылаться на anotherlnt. Это выражение 
присвоит значение anotherlnt объекту, на который iref ссылается, другими 
словами — ivar. Так же вы можете присваивать новые значения объекту, к 
которому относится ссылка. Например, выражение 

    iref = 4321; 

присвоит ivar значение 4321. Эти правила будет легче запомнить, если 
представить себе ссылки как неизменяемые альтернативные имена, похожие на 
указатели (но не идентичные им!). 
    Как следует из вышесказанного, ссылки должны быть инициализированы при их 
объявлении. Строка 7, к примеру, не может быть написана Как 

    int &iref;       // ??? 

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

    ЗАМЕЧАНИЕ 
    
    Ссылки нельзя инициализировать значениями в следующих четырех особых 
случаях: при их объявления о ключевым словом extern, при использовании в 
качестве параметров функции, при использовании в качестве типа возвращаемого 
значения функции или в объявлениях классов (см. главу 13). 


    298     Часть III. Программирование на ANSI C++ 
