- •Оглавление
- •1.2. Свойства языков программирования
- •1.3. Основные парадигмы программирования Процедурное программирование
- •Модульное программирование
- •Абстракция данных
- •Объектно-ориентированное программирование
- •Непечатные символы
- •Тема 2 Типы данных
- •2.1. Понятие переменной и объявление переменных
- •Объявление переменных
- •Встроенные типы данных
- •Размер памяти, выделяемой под встроенные типы данных
- •2.2. Константы и перечисления Константные переменные
- •Перечисления
- •2.3. Операции и выражения
- •Мультипликативные операции
- •Операции сравнения
- •Побитовые логические операции
- •Побитовые операции
- •Комментарии
- •Оператор while(пока)
- •Оператор do/while(выполнять/пока)
- •Оператор for(цикл)
- •Оператор множественного выбора switch
- •Операторы breakиcontinue
- •Тема 4 Массивы
- •4.1.Определение, объявление и инициализация массивов
- •Объявления и инициализация массивов в программе
- •4.2. Сортировка массивов Пузырьковая сортировка
- •Сортировка вставками
- •4.3. Поиск в массивах Линейный поиск
- •Двоичный поиск
- •4.4. Многомерные массивы
- •Тема 5 Указатели Объявления и инициализация переменных указателей
- •5.1. Операции над указателями
- •5.2. Выражения и арифметические действия с указателями
- •5.3. Взаимосвязи между указателями и массивами
- •5.4. Массивы указателей
- •5.5. Динамическое выделение памяти под массивы
- •Тема 6 Функции
- •6.2. Определения функций
- •Генерация случайных чисел
- •6.3. Классы памяти и область действия Классы памяти
- •Область действия
- •6.4. Рекурсия
- •6.5. Ссылки и ссылочные параметры
- •Вызов функций по ссылке с аргументами указателями
- •6.6. Использование спецификатораconstс указателями
- •6.7. Перегрузка функций
- •Аргументы по умолчанию
- •6.8. Передача массивов в функции
- •6.9. Указатель на функцию
- •6.10. Командная строка аргументов
- •6.11 Неопределенное количество аргументов
- •Тема 7 Введение в обработку строк
- •7.1. Работа со строками в с
- •Понятие символов и строк в с
- •Функции для работы со строками
- •Определение длины строки
- •Сложение двух строк (конкатенация)
- •Добавление к исходной строке указанного количества символов.
- •Копирование строки в другую строку
- •Сравнение строк
- •Получение строки от пользователя
- •Тема 8 Работа с файлами
- •Открытие файла
- •Чтение из файла символа или строки символов
- •Запись символа или строки символов в файл
- •Смещение внутри файла
- •Значения параметра fromwhereфункцииfseek
- •Закрытие файла
- •Тема 9 Компоновка программ и препроцессор
- •9.1. Компоновка программ
- •Проблема использования общих функций и имен
- •Использование включаемых файлов
- •9.2. Препроцессор
- •Определение макросов
- •Условная компиляция
- •Дополнительные директивы препроцессора
- •Тема 10 Структуры
- •10.1. Определение структур и доступ к элементам
- •Доступ к элементам структур
- •Использование структур
- •10.2. Битовые поля
- •10.3. Объединения
- •10.4. Построение связных списков на основе структур с самоадресацией
- •Создание простого связного списка
- •Очереди
- •Деревья
- •Список рекомендуемой литературы
6.6. Использование спецификатораconstс указателями
Спецификация constдает возможность программисту информировать компилятор о том, что значение данной переменной не должно изменяться [1].
В случае попытки изменить значение константного параметра, компилятор отлавливает ее и выдает сообщение об ошибке.
Существуют четыре способа передачи в функцию указателя:
неконстантный указатель на неконстантные данные;
неконстантный указатель на константные данные;
константный указатель на неконстантные данные;
константный указатель на константные данные.
Каждая комбинация обеспечивает доступ с разным уровнем привилегий.
Наивысший уровень доступа предоставляется неконстантным указателям на неконстантные данные – данные можно модифицировать посредством разыменования указателя, а сам указатель может быть модифицирован, чтобы он указывал на другие данные. Объявление неконстантного указателя на неконстантные данные не содержит const.
Неконстантный указатель на константные данные – это указатель, который можно модифицировать, чтобы указывать на любые элементы данных подходящего типа, но данные, на которые он ссылается, не могут быть модифицированы. Такой указатель можно было бы использовать, чтобы передать в качестве аргументов массивы функции, которая будет обрабатывать каждый элемент массива без модификации данных (рис. 6.18).
#include <iostream>
using namespace std;
void CubeByReference (const int*);
int main(){
int number2 = 5;
cout << "number2 before " << number2 << endl;
CubeByReference (&number2);
cout << "number2 after " << number2 << endl;
return 0;
}
void CubeByReference (const int* nPtr){
int number = 20;
nPtr = &number;
cout << *nPtr**nPtr**nPtr << endl;
//*nPtr= *nPtr**nPtr**nPtr; нельзя изменять данные с помощью //операции разыменования указателя
number = 1;
cout << *nPtr**nPtr**nPtr << endl;}
Рис. 6.18. Использование неконстантного указателя на константные данные
Константный указатель на неконстантные данные – это указатель, который всегда указывает на одну и ту же ячейку памяти, данные в которой можно модифицировать посредством указателя. Cсылки реализуются через константный указатель. Этот вариант реализуется по умолчанию для имени массива.Имя массива – это константный указатель на начало массива. Используя имя массива и индексы массива можно обращаться ко всем данным в массиве и изменять их. Указатели, объявленные какconst, должны получить начальные значения при своем объявлении (если указатель является параметром функции, он получает начальное значение, равное указателю, который передается в функцию)(рис. 6.19.)
void CubeByReference (int* const);
int main()
{
int number2;
number2 = 5;
cout << "number2 before " << number2 << endl; // 5
CubeByReference (&number2);
cout << "number2 after " << number2 << endl; // 125
number2 = 10;
cout << "number2 before " << number2 << endl; // 10
CubeByReference (&number2); // 1000 потом 1000000000
cout << "number2 after " << number2 << endl; // 1000
return 0;
}
void CubeByReference (int* const nPtr)
{
int number = 20;
//nPtr = &number; нельзя изменять значение указателя
cout << *nPtr**nPtr**nPtr << endl; //125
*nPtr= *nPtr**nPtr**nPtr;
number = 1;
cout << *nPtr**nPtr**nPtr << endl; //1953125
}
Рис. 6.19. Использование константного указателя на неконстантные данные
Наименьший уровень привилегий доступа предоставляет константный указатель на константные данные. Такой указатель всегда указывает на одну и ту же ячейку памяти и данные в этой ячейке нельзя модифицировать. Это выглядит так, как если бы массив нужно было передать функции, которая только просматривает массив, использует его индексы, но не модифицирует сам массив (см. рис. 6.20.).
int number1, number2;
number1 = 10;
number2 = 5;
const int * const ptr = &number2;
cout << *ptr << endl;;
//*ptr = number1; нельзя изменять данные через операцию разыменования
//ptr = &number1; нельзя изменять значение самого указателя
number1 = 10;
cout << *ptr << endl
Рис. 6.20. Использование неконстантного указателя на неконстантные данные