- •Определение и задание ссылок.
- •Правила для ссылок.
- •3. Передача параметров в Си.
- •Int main ()
- •4. Передача параметров по ссылке в Си.
- •Int main ()
- •5. Отличие ссылок от указателей.
- •6. Использование ссылок.
- •7. Чего нельзя делать со ссылками.
- •Примеры использования ссылок.
- •Отличие ссылок от указателей.
Лекция. Ссылки.
План лекции.
-
Определение и задание ссылок.
-
Правила ипользования ссылок
-
Передача параметров в С.
-
Передача параметров по ссылке.
-
Отличие ссылок от указателей.
-
Использование ссылок.
-
Что нельзя делать со ссылками.
-
Ссылки и массивы
-
Примеры на использование ссылок.
-
Определение и задание ссылок.
Ссылка представляет собой синоним имени, указанного при инициализации ссылки. Ссылку можно рассматривать как указатель, который всегда разымено-вывается.
Формат объявления ссылки:
тип & имя;
где тип — это тип величины, на которую указывает ссылка, & — оператор ссылки, означающий, что следующее за ним имя является именем переменной ссылочного типа, например:
int коl:
int& pal = kol; // ссылка pal - альтернативное имя для коl
const char& CR = ' \ n ' : // ссылка на константу
Объявление ссылок очень похоже на объявление указателей, только вместо звёздочки «*» нужно писать амперсанд «&».
-
Правила для ссылок.
• Переменная-ссылка должна явно инициализироваться при ее описании, кроме
случаев, когда она является параметром функции, описана как extern или ссылается на поле данных класса .
• После инициализации ссылке не может быть присвоена другая переменная.
• Тип ссылки должен совпадать с типом величины, на которую она ссылается.
• Не разрешается определять указатели на ссылки, создавать массивы ссылок и
ссылки на ссылки.
Ссылки применяются чаще всего в качестве параметров функций и типов возвращаемых функциями значений. Ссылки позволяют использовать в функ-циях переменные, передаваемые по адресу, без операции разадресации, что улучшает читаемость программы.
Ссылка, в отличие от указателя, не занимает дополнительного пространства в памяти и является просто другим именем величины. Операция над ссылкой приводит к изменению величины, на которую она ссылается.
3. Передача параметров в Си.
В Си аргументы всегда передаются единственным образом, часто называемым «передачей по значению». Например, пусть есть функция
void foo (int x)
{
x = 17;
}
Мы можем вызывать её любым из следующих способов:
int main ()
{
int z = 5;
foo (z);
foo (z + 1);
foo (125);
}
Разумеется, ни один из этих вызовов не изменяет значения переменной z. (Для последних двух вызовов это совершенно естественно, а вот в первом случае вы могли засомневаться.)
Что же делать, если мы хотим дать возможность функции foo изменять значение переданной переменной? Мы можем передать ей не саму переменную, а указа-тель (и для C, и для C++). Перепишем предыдущий пример так:
void foo (int *x)
{
*x = 17;
}
Int main ()
{
int z = 5;
foo (&z);
/* остальные варианты больше не имеют смысла */
/* z теперь равно 17 */
}
Такая передача аргументов, однако, опасна: легко забыть звёздочку в теле функ-ции foo или амперсанд — в её вызове. Представьте себе, что foo состоит из 1234 строк, и везде, где употребляется x, нужна звёздочка. А ещё она вызыва-ется 56 раз в разных местах программы — при этом иногда нужен амперсанд, иногда нет. Это — стандартная ситуация для реальных, а не учебных, программ. Итак, указатели опасны, а передача параметров по указателю опасна вдвойне (утверждение спорное и зависит от вкуса разработчика. Некоторые разработ-чики, напротив, предпочитают наличие амперсанда в f(&obj) как подсказки о том, что значение obj может измениться внутри вызова).