Список контрольных вопросов

Указатели

Указатель - это целочисленная без знаковая переменная, предназначенная для хранения адреса объекта в памяти и обеспечении доступа к нему. Размер указателя обычно равен разрядности вычислительной машины.

Указатель не является самостоятельным типом данных, он всегда связан с каким-либо другим конкретным типом. В С++ есть три вида указателей, отличающихся свойствами и набором допустимых операций: типизированные указатели, бестиповые указатели и указатели на функции. Указатели одного вида можно сравнивать друг с другом на равенство/неравенство и присваивать друг другу.

Наиболее часто используются типизированные указатели, то есть указатели, которые ссылаются на величины определенного типа. С ними разрешается выполнять арифметические действия. С бестиповым указателем никаких арифметических операций выполнять нельзя, однако с помощью преобразования типа такой указатель всегда можно преобразовать в типизированный. Обычно бестиповые указатели применяются в качестве параметров функций для повышения универсальности программы.

Операции с указателями

С указателями можно выполнять следующие операции: разадресация (*), присваивание, сложение с константой, вычитание, инкремент (++), декремент (- -), сравнение, приведение типов. При работе с указателями часто используется операция получения адреса (&).

Операция разадресации, или разыменования, предназначена для доступа к величине, адрес которой хранится в указателе. Эту операцию можно использовать как для получения, так и для изменения значения величины (если она не объявлена как константа)

 

На одну и ту же область памяти может ссылаться несколько указателей различного типа. Примененная к ним операция разадресации даст разные результаты.

Синтаксис операции явного приведения типа прост: перед именем переменной в скобках указывается тип, к которому ее требуется преобразовать.

Эта операция унаследована из С и считается устаревшей, поскольку не обеспечивает безопасности. Явное преобразование типов указателей лучше делать с помощью операций преобразования С++ static_cast и reinterpret_cast.

Преобразование типизированных указателей можно выполнить только с помощью операции reinterpret_cast. Операция static_cast не выполняет преобразование типизированных указателей, поскольку они не считаются "родственными".

При смешивании в выражении указателей разных типов явное преобразование типов требуется для всех указателей, кроме void*. Указатель может неявно преобразовываться в значение типа bool.

 

 

Ссылки

Ссылка представляет собой синоним имени, указанного при инициализации ссылки. Ссылку можно рассматривать как указатель, который всегда разыменовывается.

Формат объявления ссылки:

тип & имя;

где тип — это тип величины, на которую указывает ссылка, & — оператор ссылки,

означающий, что следующее за ним имя является именем переменной ссылочного

типа, например:

1nt ко!: 1nt& pal = kol; // ссылка pal - альтернативное имя для ко! const char& CR = ' \ n ' : // ссылка на константу

Запомните следующие правила.

• Переменная-ссылка должна явно инициализироваться при ее описании, кроме случаев, когда она является параметром функции, описана как extern или ссылается на поле данных класса.

• После инициализации ссылке не может быть присвоена другая переменная.

• Тип ссылки должен совпадать с типом величины, на которую она ссылается.

• Не разрешается определять указатели на ссылки, создавать массивы ссылок иссылки на ссылки.

Ссылки применяются чаще всего в качестве параметров функций и типов возвращаемых функциями значений. Ссылки позволяют использовать в функциях переменные, передаваемые по адресу, без операции разадресации, что улучшает читаемость программы.

Ссылка, в отличие от указателя, не занимает дополнительного пространства в памяти и является просто другим именем величины. Операция над ссылкой приводит к изменению величины, на которую она ссылается.

Массивы

При использовании простых переменных каждой области памяти для хранения данных соответствует свое имя. Если с группой величин одинакового типа требуется выполнять однообразные действия, им дают одно имя, а различают по порядковому номеру.

Конечная именованная последовательность однотипных величин называется массивом.

В С++ различают массивы фиксированного размера и массивы переменного размера ( динамические ). Количество элементов в массиве первого типа известно при написании программы и никогда не меняется. Память под такой массив выделяет компилятор. Количество элементов динамического массива на этапе компиляции не известно и, как правило, зависит от входных данных. Память под динамический массив выделяется во время выполнения программы с помощью операций выделения памяти.

Описание массива фиксированного размера отличается от описания простой переменной наличием после имени квадратных скобок, в которых задается количество элементов массива ( размерность ):

float a [10]; //Пример описания массива из 10 вещественных чисел

Тип элементов массива - любой допустимый тип С++, например, встроенный или библиотечный, кроме типа void. Элементы массива нумеруются с нуля. Глобальный массив по умолчанию инициализируется нулями. Локальный массив, как и обычная переменная, по умолчанию никак не инициализируется. Инициализирующие значения при желании задают в фигурных скобках:

int b[5] = {3, 2, 1}; // b[0]=3, b[1]=2, b[2]=1, b[3]=0, b[4]=0

Размерность массива может быть задана только целой положительной константой или константным выражением.

Для доступа к элементу массива после его имени указывается номер элемента ( индекс ) в квадратных скобках. В следующем примере подсчитывается сумма элементов массива.

#include <iostream> using namespace std; int main(){ const int n = 10; int marks[n] = {3, 4, 5, 4, 4}; for (int i = 0, sum = 0; i<n; i++) sum += marks[i]; cout << "Сумма элементов: " << sum;}

Размерность массивов предпочтительнее задавать с помощью типизированных констант.

Динамические массивы создают с помощью операции new, при этом необходимо указать тип и размерность, например:

float *p = new float [100];

В этой строке создается переменная-указатель на float, в динамической памяти отводится непрерывная область, достаточная для размещения 100 элементов вещественного типа, и адрес ее начала записывается в указатель p. Динамические массивы нельзя при создании инициализировать, и они не обнуляются.

Преимущество динамических массивов состоит в том, что их размерность может не быть константой.

Память, зарезервированная под динамический массив с помощью new [], должна освобождаться оператором delete [], а память, выделенная функцией malloc - посредством функции free, например:

delete [] p; free (q);

Размерность массива не указывается, но квадратные скобки обязательны. Динамический массив можно обнулить с помощью конструкции "инициализация нулем". Для этого следует указать круглые скобки после квадратных, например:

float *p = new float [n]();

 

Многомерные массивы фиксированного размера задаются указанием каждого измерения в квадратных скобках, например, оператор

int matr [6][8];

задает описание двумерного массива из 6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее всего изменяется последний индекс.

Для доступа к элементу многомерного массива указываются все его индексы, например, matr[i][j].

Инициализация многомерного массива:

int mass2 [][] = { {1, 1}, {0, 2}, {1, 0} };

int mass2 [3][2] = {1, 1, 0, 2, 1, 0};

Для создания многомерного массива в динамической памяти необходимо указать все его размерности (первая из них может быть переменной):

matr = new int [a] [b];

Освобождение памяти из-под массива с любым количеством измерений выполняется с помощью операции delete []. Указатель на константу удалить нельзя.

Список использованной литературы:

а) основная литература:

1. Т, А. Павловская C/C++ Программирование на языке высокого уровня. Год издания: 2012.

2. Литвиненко Н. А. - Технология программирования на С++. Год издания: 2013. Издательство: БХВ-Петербург.

б) дополнительная литература:

3. Коплиен Дж. - Мультипарадигменное проектирование для с++.

4. Богуславский Ан.А., Соколов С.М. Основы программирования на языке Си++: Для студентов физико-математических факультетов педагогических институтов. Часть I. Введение в программирование на языке Си++. - Коломна: КГПИ, 2012. - 490 с.

5. Дейтел Х.М, Дейтел П.Д. Как программировать на С: пер. с англ. – М.: БИНОМ, 2014.— 908 с.: ил.

6. Шилдт Г. Полный справочник по C++: Пер. с англ. – М.: Вильямс, 2013 .— 699 с.

7. Подбельский В.В. Язык Си++: учебное пособие для вузов.

8. Степанов Е.О., Чириков С.В. Стиль программирования на C++. Учебное пособие. - СПб.: СПбГИТМО(ТУ), 2015. - 48 с.

Список контрольных вопросов

1. Какой оператор используется для получения адреса переменной?

2. Какой оператор позволяет получить значение, записанное по адресу, содержащемуся в указателе?

3. В чем разница между адресом, который хранится в указателе, и значением, записанным по этому адресу?

4. В чем разница между оператором разыменования и оператором получения адреса?

5. Покажите разницу между ссылкой и указателем?

6. Как обратиться к первому и последнему элементу массива?

7. Сколько элементов содержится в массиве B[5][5][4]?

8. Что такое указатель?

9. Перечислите операции с указателем?

10. Какие правила существуют у ссылок?