- •1.1. Понятие указателя
- •Int* ptrInt;
- •1.2. Синтаксис описания указателя
- •1.3. Адрес переменной и значение переменной по адресу
- •Int main()
- •1.4. Адресная арифметика
- •1.5. Обращение к элементам массива
- •1.6. Приведение типов при работе с указателями
- •1.7. Работа с динамическими переменными
- •2.2. Передача параметров по адресу
- •Void swap(int* a, int* b)
- •2.3. Передача больших объемов данных
- •2.4. Инициализация указателей
- •2.5. Применение ссылок при работе с функциями
- •Void swap(int& a, int& b)
- •Int main()
- •Int Carrage(int* cr);
2.5. Применение ссылок при работе с функциями
В языке C++ появился новый механизм работы с переменными — ссылки. Функция swap() работала правильно, только не слишком удобно применять постоянное разыменование указателей.
С помощью ссылок функция swap() может выглядеть аккуратнее.
Void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
Т.к. ссылка является синонимом имени переменной, то вызов функции будет выполнен без взятия адреса переменных:
swap(x, y);
Конструкция int& объявляет ссылку на переменную типа int. При таком объявлении функции в стек будут положены не значения переменных, а их адреса.
Ссылка — это указатель, с которым можно работать, как с обычной переменной. Важные отличия ссылки от указателя заключаются в следующем:
Ссылка должна быть проинициализирована.
Ссылка не может быть равна NULL.
Для взятия адреса переменной и для объявления ссылки используется одинаковый символ — & (амперсанд). Понять, чем является & в каждом конкретном случае несложно, если помнить следующее правило:
Если & используется при объявлении переменной, то такая переменная будет являться ссылкой. Во всех остальных случаях (кроме логических операций) & будет означать взятие адреса от переменной.
На начальном этапе за рамками рассмотрения остается приведение типов ссылок (приведение ссылочных типов может привести к генерации исключения).
Примеры:
int x; //объявление переменной целого типа
int* p; //объявление указателя на переменную целого типа
int& r = x; // объявление ссылки на значение целого типа
int* &rp = p; // объявление ссылки на указатель, указывающий на переменную целого типа
int& rr; // ошибка компиляции. Ссылка должна быть проинициализирована
p = &x; //присвоить p адрес переменной x
x = *p; //присвоить x значение, которое находится по адресу, сохраненному в p
Возможен и такой вариант:
int *p; // объявление неинициализированного указателя на переменную целого типа
int **pp = &p; // объявление указателя на указатель и инициализация его адресом, по которому
//размещен указатель p
Логические операции:
(a == 0) && (b!=0) - логическое И
(a & b) - побитовая операция И (пример: a = 01010101; b = 00001111; a & b = 00000101)
2.6. Как правильно вызывать функции
Изучая основы программирования по работе с функциями, не всегда просто понять, как правильно вызывать функцию. Тем не менее, все очень просто, попробуем в этом разобраться.
Чтобы вызвать функцию вам нужно знать только ее прототип. Прототип – это заголовок функции вместе с формальными параметрами.
Примеры:
int Grow(int a, float* c);
int Carrage(int* cr);
void SetVal(int &s);
Прототип функции дает нам всю необходимую информацию для вызова функции:
функция Grow требует первый параметр типа int, второй - указатель на тип float.
функция Carrage требует один параметр - указатель на тип int.
функция SetVal требует один параметр – ссылку на переменную типа int.
Теперь нужно определить какие переменные у нас есть в том месте, где мы хотели бы осуществить вызов этих функций. Допустим, мы будем вызывать их из главной программы, в которой у нас объявлены следующие переменные:
