
- •2. Общие рекомендации к выполнению и требования к оформлению контрольной работы
- •3. Темы заданий для выполнения контрольной работы
- •4. 1. Базовые средства языка
- •Алфавит языка
- •Ключевые слова языка
- •Идентификаторы
- •Комментарии
- •4.1.5. Типы данных Си
- •Логический тип
- •4.1.8. Операции и выражения
- •Операции присваивания
- •Арифметические операции
- •Логические операции
- •Операции отношения
- •Условная операция
- •Операция преобразования типа
- •Операция определения размера
- •4.1.9. Стандартные функции
- •4.1.10. Структура программы
- •4.1.11. Ввод и вывод данных
- •Функции ввода- вывода
- •Объектно-ориентированные средства ввода-вывода.
- •4.2. Операторы управления
- •4.2.1. Понятие алгоритма
- •4.2.2. Изображение алгоритма в виде блок-схемы
- •2.3. Составной оператор
- •2.4. Операторы ветвления
- •If (выражение) оператор;
- •4.2.5. Примеры программ
- •4.2.6. Оператор варианта
- •4.2.7. Алгоритмы циклической структуры
- •Оператор цикла с предусловием
- •Оператор цикла с постусловием
- •Оператор цикла с параметром
- •Операторы передачи управления
- •4.2.8. Решение задач с использованием циклов
- •4.3. Обработка массивов
- •4.3.1. Описание массивов
- •4.3.2. Основные операции над массивами
- •4.3.3. Ввод-вывод элементов массива
- •4.3.4. Вычисление суммы элементов массива
- •4.3.5. Вычисление произведения элементов массива
- •4.3.6. Поиск максимального элемента и его номера
- •4.3.7. Сортировка элементов в массиве
- •4.3.8. Удаление элемента из массива
- •4.3.9. Решение задач с использованием массивов
- •4.4. Обработка матриц
- •4.4.1. Ввод-вывод матрицы
- •4.4.2. Примеры алгоритмов обработки матрицами
- •4.5.1. Передача параметров в функцию
- •4.5.2. Возврат результата с помощью оператора return
- •4.6. Указатели и динамические массивы
- •4.6.2. Операции * и & при работе с указателями
- •4.6.3. Операция присваивания указателей
- •4.6.4. Арифметические операции над адресами
- •4.6.5. Динамические массивы
- •4.6.6. Использование указателей в качестве аргументов функций
- •Литература
4.6.2. Операции * и & при работе с указателями
При работе с указателями часто используют операции получения адреса & и разадресации * (табл. 8).
Таблица 8. Операции для работы с указателями
Операция |
Адрес |
Значение, хранящееся по адресу |
тип *p; |
p |
*p |
тип p; |
&p |
p |
Операция получения адреса & возвращает адрес своего операнда.
Например:
float a; //Объявлена вещественная переменная а
float *adr_a; //Объявлен указатель на тип float
adr_a=&a; //Оператор записывает в переменную
//adr_a адрес переменной a
Операция разадресации * возвращает значение переменной, хранящееся по заданному адресу, т.е. выполняет действие, обратное операции &:
float a; //Объявлена вещественная переменная а.
float *adr_a; //Объявлен указатель на тип float.
a=*adr_a; //Записывает в переменную a значение,
//хранящееся по адресу adr_a.
4.6.3. Операция присваивания указателей
Значение одного указателя можно присвоить другому. Если указатели одного типа, то для этого применяют обычную операцию присваивания. Пример:
float PI=3.14159,*p1,*p2;
p1=p2=Π
Здесь определены:
переменная PI=3.14159
указатели на тип float – p1 и p2.
Далее в указатели p1 и p2 записывается адрес переменной PI.
Если указатели ссылаются на различные типы, то при присваивании значения одного указателя другому, необходимо использовать преобразование типов6. Без преобразования можно присваивать любому указателю указатель void*.
4.6.4. Арифметические операции над адресами
Над адресами С++ определены следующие арифметические операции:
сложение и вычитание указателей с константой;
вычитание одного указателя из другого;
инкремент;
декремент.
Сложение и вычитание указателей с константой n означает, что указатель перемещается по ячейкам памяти на столько байт, сколько занимает n переменных того типа на который он указывает7.
Вычитание двух указателей определяет сколько переменных данного типа размещается между указанными ячейками.
Эти операции применимы только к указателям одного типа и имеют смысл в основном при работе со структурными типами.
Разность двух указателей это разность их значений, деленная на размер типа в байтах. Так разность указателей на третий и нулевой элементы массива равна трем, а на третий и девятый – шести. Суммирование двух указателей не допускается.
Инкремент перемещает указатель к следующему элементу массива, а декремент – к предыдущему:
double *p1; float *p2; int *i, n;
p1++; //Увеличение значения адреса на 8.
p2++; //Увеличение значения адреса на 4.
i++; //Увеличение значения адреса на 2.
К указателям так же применимы операции отношения ==, !=, <, >, <=, >=. Иными словами указатели можно сравнивать. Например, если i указывает на пятый элемент массива, а j на первый, то отношение i>j истинно. Любой указатель всегда можно сравнить на равенство с нулем. Все эти утверждения верны, если речь идет об указателях ссылающихся на один массив. В противном случае результат арифметических операций и операций отношения будет не определен.