Арифметические операции над указателями

С указателями можно использовать только четыре арифметических оператора: ++, -- , +и-.

Чтобы лучше понять, что происходит при выполнении арифме­тических действий с указателями, начнем с примера. Пусть р1 — указатель на int-переменную с текущим значением 2000 (т.е. р1 содержит адрес 2000). После выполнения (в 32-разрядной среде) выражения p1++ содержимое переменной-указателя р1 станет равным 2004, а не 2001. Дело в том, что при каждом инкрементировании указатель р1 будет указывать на сле­дующее int-значение. Для операции декрементирования справедливо обратное утверждение, т.е. при каждом декрементировании значение р1 будет уменьшать­ся на 4. Например, после выполнения инструкции p1--; указатель р1 будет иметь значение 1996, если до этого оно было равно 2000.

Итак, каждый раз, когда указатель инкрементируется, он будет указывать на область памяти, содержащую следующий элемент базовоготипа этого указателя. А при каждом декрементировании он будет указывать па область памяти, содержа­щую предыдущий элемент базового типа этого указателя.

Для указателей на сим­вольные значения результат операций инкрементирования и декрементирования будет таким же, как при "нормальной" арифметике, поскольку символы занимают только один байт. Но при использовании любого другого типа указателя при инкре­ментировании или декрементировании значение переменной-указателя будет уве­личиваться или уменьшаться на величину, равную размеру его базового типа.

Выражение p1=p1+9 заставляет р1 ссылаться на девятый элемент базового типа указателя р1 относи­тельно элемента, на который р1 ссылался до выполнения этой инструкции.

Несмотря на то, что складывать указатели нельзя, один указатель можно вы­честь из другого (если они оба имеют один и тот же базовыйтип). Разность покажет количество элементов базового типа, которые разделяют эти два указателя.

Помимо сложения указателя с целочисленным значением и вычитания его из указателя, а также вычисления разности двух указателей, над указателями ника­кие другие арифметические операции не выполняются. Например, с указателями нельзя складывать float- или double-значения.

С указателями используются следующие операции:

· & - взятие адреса переменной;

· * - разыменование указателя, т.е. получение доступа к объекту;

· -> - разыменование члена структуры;

· [] - индексация, доступ к элементу массива, при этом считается, что указатель содержит адрес 0 элемента.

6.Указатель - это тип данных, предназначенный для "указывания" на некую сущность (переменную, объект класса, функцию) в памяти. По сути, всё, за что отвечает указатель, - это хранение адреса и доступ к значению по этому адресу. Обычно размер указателя составляет 4 байта. Указатель также поддерживает арифметические операции (сложение, вычитание, присваивание значения).

& - взятие адреса переменной;

* - разыменование указателя, т.е. получение доступа к объекту;

Объявл: можно обьявлять как угодно.
int *ptr1[5]; //массив из 5 элементов,каждый из его элементов является указателем.
выделить память можно так:
for(int i=0;i<5;i++){
ptr1[i]=new int[20];
получили массив 5х20

int (*ptr)[5]; //указатель на массив из пяти элементов.
Выделить память можно так:
ptr=new int[20][5]; //получили массив 20х5

Использ: Они очень полезны. Почему? Потому что вместо передачи больших структур данных (класса, структуры, массива) в функции Вы просто передаете адрес. Размер указателя очень мал. Такое эффективное использование указателей сделает ваш код более производительным. Кроме того, они важные инструменты для операций с кучей памяти, таких как динамическое распределение и освобождение.

7. Тип данных - характеристика набора данных, которая определяет:
- диапазон возможных значений данных из набора;
- допустимые операции, которые можно выполнять над этими значениями;
- способ хранения этих значений в памяти.

Различают:
- простые типы данных: целые, действительные числа и др.;
- составные типы данных: массивы, строки и др.

Массивы :

Одномерные массивы представляют собой список взаимосвязанных переменных. Такие списки широко используются в программировании. Для современного программирования массивы являются фундаментальными объектами. Общая форма одномерного массива выглядит так: тип имя [размер]; int my_array [3]; Двумерные массивы. С++ допускает возможность создания многомерных массивов. Простейшей формой такого массива является двумерный массив. Для того, чтобы создать двумерный массив, надо записать: тип имя [число строк][число столбцов]; Обратите внимание, что левый индекс нумерует строки, а правый столбцы. В отличие о других языков программирования, которые для разделения размерностей массива используют запятые, в С++ каждый размер берется в квадратные скобки. int my_array [3][4]; Двумерные массивы хранятся в памяти в виде матрицы, состоящей из строк и столбцов. Доступ к элементам массива осуществляется по двум индексам. Двумерный массив можно рассматривать как одномерный массив, содержащий, в свою очередь, в качестве элементов одномерные массивы!

string. Строковый тип данных. Содержит нефиксированное количество различных символов. PHP не накладывает никаких ограничений на длину строки, поэтому можно смело работать даже с ОЧЕНЬ большими строками. В С++ поддерживаются два типа строк – встроенный тип, доставшийся от С, и класс string из стандартной библиотеки С++. Класс string предоставляет гораздо больше возможностей и поэтому удобней в применении, однако на практике нередки ситуации, когда необходимо пользоваться встроенным типом либо хорошо понимать, как он устроен. (Одним из примеров может являться разбор параметров командной строки, передаваемых в функцию main().

8. Тип данных - характеристика набора данных, которая определяет:
- диапазон возможных значений данных из набора;
- допустимые операции, которые можно выполнять над этими значениями;
- способ хранения этих значений в памяти.

Различают:
- простые типы данных: целые, действительные числа и др.;
- составные типы данных: массивы, строки, структуры, указатели на структуры…

Структуры

Структура (struct) — это композитный тип данных, представляющий собой набор из независимых переменных. Переменные, из которых составлена структура, называются её полями или элементами Каждое поле имеет свой тип и имя. Элементом структуры может быть переменная какого угодно типа, кроме самой структуры.

Указатели и ссылки на структуры.

1. Операция взятия адреса &. Операция разименования указателя *.

2. Операторы new и delete. Объявление и разрушение массивов.

3. Утечки памяти.

4. Использование указателя на несуществующий объект.

9. В C++ существует специальный тип указателя, который называется указателем на неопределённый тип. Для определения такого указателя вместо имени типа используется ключевое слово void в сочетании с описателем, перед которым располагается символ ptr. С одной стороны, объявленная подобным образом переменная также является объектом определённого типа - типа указатель на объект неопределённого типа. Но, с другой стороны, для объекта типа указатель на объект неопределённого типа отсутствует информация о размерах и внутренней структуре адресуемого участка памяти. Из-за этого не могут быть определены какие-либо операции для преобразования значений. Объектам типа указатель на объект неопределённого типа в качестве значений разрешается присваивать значения лишь в сочетании с операцией явного преобразования типа. В этом случае указатель на объект неопределённого типа становится обычным указателем на объект какого-либо конкретного типа. Со всеми вытекающими отсюда последствиями. Но и тогда надо постоянно напоминать транслятору о том типе данных, который в данный момент представляется указателем на объект неопределённого типа. Для указателя на объект неопределённого типа не существует способа непосредственной перенастройки указателя на следующий объект с помощью операции инкрементации. В операторе, реализующем операции инкрементации и декрементации, только с помощью операций явного преобразования типа можно сообщить транслятору величину, на которую требуется изменить первоначальное значение указателя.

10. Тип данных - характеристика набора данных, которая определяет:
- диапазон возможных значений данных из набора;
- допустимые операции, которые можно выполнять над этими значениями;
- способ хранения этих значений в памяти.

Различают:
- простые типы данных: целые, действительные числа и др.;
- составные типы данных: массивы, строки, структуры, указатели на структуры…

Структуры: Использование структур обусловлено необходимостью объединить несколько переменных. Структуры - это, обычно, группа переменных описывающих какую-нибудь сущность. Например, в игре танк можно описать группой переменных: количество снарядов, количество горючего и т.д. У нас в примере танк будет обладать следующими параметрами: координаты и количество топлива (от нуля до двадцати). Зачем нам использовать какие-то структуры спросите Вы? Ведь переменные и так прекрасно хранятся. Причин две: переменные в структурах хранятся в одном месте и можно создавать несколько структурных переменных и у всех у них будут одинаковые характеристики. Объявления у структуры нет. Её нужно сразу определять. Тело структуры должно находиться до начала main. Когда мы определяем структуру, под неё не выделяется память. Структура - это как шаблон.

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

11. Условные операторы - это специальные коды-символы, которые могут выполнять какие-то сценарии. Условный оператор реализует выполнение определённых команд при условии, что некоторое логическое выражение (условие) принимает значение «истина» true

Условный оператор if

if (условие) {блок из одного или более операторов}

Если условие верно, то выполняется блок из одного или более операторов

Второй вариант:

if (условие) {блок 1 из одного или более операторов} else {блок 2 из одного или более операторов}

Оператор while

Цикл while - цикл с неизвестным числом повторений

while (условие) {блок из одного или нескольких операторов}

Если условие истинно (принимает не нулевое значение), то выполняется блок из одного или нескольких операторов и происходит возврат на проверку условия. Если условие ложно, происходит выход из цикла. Условие может быть составлено из нескольких выражений, с использованием || (логическое сложение "или") и &&(логическое умножение "и")

Оператор do...while

do...while - это цикл с постусловием.

Цикл do ... while - цикл с неизвестным числом повторений. В отличие от цикла while условие проверяется в конце цикла. Поэтому тело цикла выполняется хотя бы один раз

do {блок из одного или нескольких операторов} while (условие)

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

В языке C++ существует три вида циклов: цикл while c предусловием, цикл while с постусловием, цикл for.

Цикл while ("пока") с предусловием

Цикл while с предусловием позволяет выполнить одну и ту же последовательность действий пока проверяемое условие истинно. При этом условие записывается до тела цикла и проверяется до выполнения тела цикла.

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

Синтаксис цикла while ("пока") c предусловием такой:

while (условие)
{
блок инструкций
}

Цикл do while ("пока") с постусловием

Цикл "пока" с постусловием отличается от цикла с предусловием тем, что сначала выполняется блок цикла, а потом проверяется условие. Если условие истинно, то цикл будет выполнен еще раз, и так до тех пор, пока условие будет истинно. Синтаксис цикла с постусловием такой (обратите внимание на обязательную точку с запятой после условия):

do
{
Блок инструкций
}
while (условие);

Поскольку условие проверяется после выполнения тела цикла, то блок цикла с постусловием всегда будет выполнен хотя бы один раз, независимо от истинности условия. Это может привести к ошибкам, поэтому использовать цикл while с постусловием следует только тогда, когда это действительно упрощает алгоритм.

Цикл for

При использовании цикла for необходимо задать три параметра (в круглых скобках через точку с запятой).

Первый параметр – начальное значение переменной, задается в виде присваивания переменной значения, в нашем случае – i=1.

Второй параметр – конечное значение переменной, задается в виде условия на значение переменной. Цикл будет исполняться, пока условие истинно, в нашем случае условие i<=n означает, что переменная i будет принимать значения до n включительно.

Третий параметр – шаг изменения переменной. Запись ++i означает, что переменная i будет увеличиваться на 1 с каждым новым исполнением цикла, запись --i – уменьшаться.

Оператор цикла for имеет следующий синтаксис:

for (int i=0; i<20; i++) {действие}

В языке Си++ нет особого подхода к вложенным циклам. Как и в других языках программирования, в Си рассматриваются внутренние и внешние циклы. Их-то и называют вложенными. Если один цикл находится внутри другого цикла, то первый цикл называют внутренним, а второй - внешним. Подобные циклы Вы чаще всего можете встретить при работе с таблицами. Например, простейшей таблицой, как известно, является таблица умножения: 2 х 2 = 4 и так далее.

Наши рекомендации