- •Лексемы
- •Идентификаторы
- •Константы
- •Операции
- •Знаки пунктуации
- •Основные типы данных.
- •Описание переменных
- •Оператор присваивания
- •Примеры программ
- •Форматированный ввод, вывод
- •Особенности ввода, вывода символов
- •Функции gets, puts, atoi, atol и atof
- •Занятие 2. Операторы выбора.
- •Выражения, операции
- •Логические операции
- •Условная операция
- •Условный оператор
- •Оператор перехода goto
- •Оператор выбора switch
- •Оператор цикла с предусловием (while)
- •Оператор цикла с постусловием (do - while)
- •Оператор цикла for
- •Примеры использования операторо цикла
- •Занятие 3. Указатели. Ссылки. Массивы. Работа со строками.
- •Указатели
- •Операции разыменования и взятия адреса
- •Инициализация указателей
- •Арифметические операции с указателями
- •Присваивание указателей
- •Сравнение указателей
- •Операция new
- •Операция delete
- •Примеры использования указателей
- •Одномерные массивы
- •Инициализация одномерных массивов
- •Примеры работы с одномерными массивами
- •Многомерные массивы
- •Занятие 4. Указатели и массивы.
- •Указатели и одномерные массивы
- •Размещение одномерных массивов в динамической памяти.
- •Массивы указателей
- •Занятие 5. Указатели и многомерные массивы.
- •Двухмерный массив и вспомогательный массив указателей
- •Список рекомендуемой литературы.
Примеры использования указателей
Пример 1. Объявить и инициализировать переменную типа float и указатель на нее. Вывести на экран содержимое области памяти, на которую указывает этот указатель.
#include <stdio.h>
int main()
{
float f=100.25;
float *pi=&f;
printf(“Значение переменной f= %f \n”,f);
printf(“Адрес переменной f: pi=%p\n”,&f); //Форматная спецификация %p
//используется для печати значения указателя
printf(“Cодержимое ячейки по адресу pi %f”,*pi);
return 0;
}
Пример 2. Задать значения двух целых переменных. Используя указатели на них, поменять значения этих переменных.
#include <stdio.h>
int main()
{ int *px, *py, x=5,y=10; // px и py являются указателями
int temp;
px = &x; py = &y;
printf(“x=%3d; y=%3d \n”, x,y);
temp=*px; // Переменной temp присваивается значение, на которое указывает px
*px=*py; // Теперь по адресу px находится значение y
*py=temp;
printf(“x=%3d; y=%3d \n”, x,y);
return 0;
}
Ссылки
В С++ имеется несколько видоизмененная форма указателя, называемая ссылкой. Ссылка на некоторую переменную может рассматриваться как указатель, который при употреблении всегда разыменовывается. Однако для ссылки не требуется дополнительного пространства в памяти: она является просто другим именем, или псевдонимом переменной. Поэтому все, что делается со ссылкой, в действительности происходит с переменной, на которую она ссылается. Ссылка определяется в программе следующим образом
тип &имя_ссылки=имя_переменной;
например, int &rt = t;. Оператор ссылки (&) выглядит так же, как оператор адреса, который используется для возвращения адреса при работе с указателями. Но это не одинаковые операторы. При определении ссылки необходимо ее инициализировать. Если объявить ссылку без инициализации, будет сгенерирована ошибка компиляции. Так как ссылка является псевдонимом своего адресата, то применение оператора взятия адреса к ссылке возвратит адрес ее адресата. Переназначить ссылку нельзя. Она ссылается на свой адресат и только на него. Когда указатели не инициализированы, им следует присваивать нулевое значение (0). Это не касается ссылок. Ссылка не может быть нулевой.
Пример 1.
Дана переменная x и ссылка на нее. Изменить значение ссылки и после этого вывести на экран значение переменной x.
#include <stdio.h>
int main()
{
int x;
int &rx=x; // rx – ссылка на x
x=5;
printf(“x=%d \n”, x); // Значение переменной x
printf(“rx=%d \n”,rx); // совпадает со значением ссылки rx
rx = 7; // Меняем значение ссылки,
printf(“x=%d \n”, x); // что автоматически меняет значение переменной x
printf(“rx=%d \n”,rx);
return 0;
}
Пример 2.
Дано a,b. Найти s=a+b. Изменить значения переменных с помощью ссылки на них.
#include <stdio.h>
int main()
{
int a,b,s;
int &ra=a, &rb=b, &rs=s;
printf(“введите a,b\n”);
scanf(“%d%d”,&a,&b); /* Ввод чисел a и b */
s=a+b;
/* Выводим адреса переменных a, b, s, и значений переменных a, b, s */
printf(“&a=%d &b=%d &s=%d a=%d b=%d s=%d\n”,(int)&a,(int)&b, (int)&s,a,b,s);
/* Вывод на экран значений адресов ссылок ra, rb, rs, и значений самих ссылок ra, rb, rs, что полностью эквивалентно предыдущему выводу*/
printf(“&ra=%d &rb=%d &rs=%d ra=%d rb=%d rs=%d\n”,(int)&ra, (int)&rb, (int)&rs,ra,rb,rs);
/* Изменение значений ссылок ra, rb, rs, что эквивалентно
изменению значений переменных a,b,s */
ra=ra*2;
rb=rb*2;
rs=ra+rb;
printf(“&a=%d &b=%d &s=%d a=%d b=%d s=%d\n”,(int)&a, (int)&b, (int)&s,a,b,s);
printf(“&ra=%d &rb=%d &rs=%d ra=%d rb=%d rs=%d\n”,(int)&ra,
(int)&rb, (int)&rs,ra,rb,rs);
}
Связь между переменной, ячейкой памяти, указателем и ссылкой на переменную показана на рисунке 5.1.
Рисунок 5.1 – Переменная, ссылка и указатель на переменную.