- •Оглавление
- •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. Построение связных списков на основе структур с самоадресацией
- •Создание простого связного списка
- •Очереди
- •Деревья
- •Список рекомендуемой литературы
Тема 5 Указатели Объявления и инициализация переменных указателей
Указатели– это переменные, которые содержат в качестве своих значений адреса памяти [1]. С другой стороны, указатель хранит адрес переменной, которая содержит определенное значение. В этом смысле имя переменной отсылает к значению прямо, а указатель – косвенно. Ссылка на значение посредством указателя называетсякосвенной адресацией.
Указатели, подобно любым другим переменным, перед своим использованием должны быть объявлены. Следующая строка
int *countPtr, count;
объявляет переменную countPtrтипаint*(т.е. указатель на целое число) и читается как «countPtrявляется указателем на целое число» или «countPtrуказывает на объект типаint». Однако переменнаяcountобъявлена как целое число, а не как указатель на целое число. Символ*в объявлении относится только кcountPtr. Каждая переменная, объявляемая как указатель, должна иметь перед собой знак звездочки (*). Например, объявление
float *xPtr, *yPtr;
указывает, что и xPtrиyPtr являются указателями на значения типаfloat. Использование*подобным образом в объявлении показывает, что переменная объявляется как указатель. Указатели можно объявлять, чтобы указывать на объекты любого типа данных.
Указатели должны инициализироваться либо при своем объявлении, либо с помощью операции присваивания. Указатель может получить в качестве начального значения 0или адрес. Указатель с начальным значением0ни на что не указывает.
5.1. Операции над указателями
1. Операция& или операция адресации– унарная операция, которая возвращает адрес своего операнда. Например, если имеются объявления
int y = 5;
int *yPtr;
то оператор
yPtr = &y;
присваивает адрес переменной ууказателюyPtr. Говорят, что переменнаяyPtrуказывает нау. Операнд операции адресации должен бытьL-величиной (т.е. чем-то таким, чему можно присвоить значение так же, как переменной); операция адресации не может быть применена к константам, к выражениям, не дающим результат, на который можно сослаться.
2. Операция *, называемаяоперацией косвенной адресацииилиоперацией разыменования, возвращает значение объекта, на который указывает ее операнд (т.е. указатель). Например, оператор
cout << *yPtr << endl;
выведет на экран значение, на которое ссылается указатель (число 5).
Программа на рис. 5.1. демонстрирует операции с указателями.
#include <iostream>
using namespace std;
int main()
{
int a;
int *aPtr;
a= 7;
aPtr = &a;
cout << "Address a is: " << &a << endl; // 0х0012FF7C
cout << "Value aPtr is: " << aPtr << endl; // 0х0012FF7C
cout << "Value a is: " << a << endl; // 7
cout << "Value *aPtr is:" << *aPtr << endl; // 7
cout << "Proof of adding & and *" << endl;
cout << "&*aPtr is " << &*aPtr << endl; // 0х0012FF7C
cout << "*&aPtr ia " << *&aPtr << endl; // 0х0012FF7C
return 0;
}
Рис. 5.1. Операции с указателями
Ячейки памяти выводятся как шестнадцатеричные целые с помощью cout. Адресаи значениеaPtrидентичны – это подтверждает, что адресадействительно присвоен переменной указателюaPtr. Операции&и*взаимно дополняют друг друга – при их поочередном применении кaPtrв любой последовательности будет напечатан один и тот же результат.