Первый слайд презентации
Операции с указателями Операция Результат Действие pointer+offset Указатель Вычисляет адрес элемента, расположенного через offset элементов после pointer pointer-offset Указатель Операция, противоположная сложению pointer 2 -pointer 1 Смещение Вычисляет количество элементов между pointer 1 и pointer 2 В этой таблице offset (англ. – смещение) имеет тип int (операции, близкие к сложению и вычитанию, такие как ++ и +=, которые также могут применяться к указателям).
Слайд 2
Суммирование двух указателей является в C++ некорректной операцией. Также бессмысленно умножать или делить, возводить их в квадрат или извлекать квадратный корень. Например, есть квартал, в котором все дома пронумерованы по порядку. Дом, следующий за домом Курчатова 7, будет иметь адрес Курчатова 8 (или Курчатова 6, если идти в противоположную сторону). Очевидно, что в таком случае через четыре дома от Курчатова 7 будет находиться дом с адресом Курчатова 11. Адрес этого дома можно записать так 7 Kurchatov + 4 = 11 Kurchatov И наоборот, если поинтересоваться, сколько домов находится между домами 7 и 11, ответом будет 4: 11 Kurchatov – 7 Kurchatov = 4 Понятно, что любой дом находится относительно самого себя на расстоянии нуль домов: 7 Kurchatov – 7 Kurchatov = 0 Складывать дома 7 и 11 не имеет смысла, поэтому и указатели суммировать бессмысленно.
Слайд 4
Массив по сути является адресом его первого элемента. Имя массива – это указатель на элемент массива с индексом [0]. Если всё же попытаться использовать &, то компилятору это категорически не понравится: Указатель и массив Следовательно, чтобы записать адрес массива в указатель, не нужно использовать & для взятия адреса массива:
Слайд 5
Массив тоже очень “ похож ” на городской квартал. Каждый элемент массива выступает в качестве дома в этом квартале. Дома – элементы массива – отсчитываются по порядку от начала квартала. Дом на углу улицы отстоит на 0 домов от угла, следующий дом отстоит на 1 дом от угла и т.д. Пользуясь терминологией массивов, можно сказать, что cityblock [0] представляет собой дом по адресу Kurchatov 7, cityblock [1] – дом по адресу Kurchatov 8 и т.д. Например, есть массив из 32-х однобайтовых значений, имеющий имя charArray. Если первый элемент массива находится по адресу 0 x 100, тогда массив будет продолжаться вплоть до адреса 0 x12f. Созданы два указателя: В * pMyArray записывается то, что хранится в myArray (т.е. адрес первого элемента), и в * pElement записывается адрес первого элемента. На выводе видно, что, действительно, массив – это указатель, который хранит адрес своего первого элемента.
Слайд 7
Смещение Результат Соответствует Значение +0 0029 FE54 myArray [0] 2 + 1 0029 FE58 myArray [1] 4 + 2 0029 FE5 C myArray [2] 6 ... … ... + n 0029 FE54+n myArray [n] Итак, после выполнения строки указатель pElement может, например, содержать адрес 0029 FE54. Можно прибавить к этому адресу целочисленное смещение и перейти к необходимому элементу массива:
Слайд 8
Поскольку * имеет более высокий приоритет, чем сложение, операция * pMyArray+n привела бы к сложению n со значением, на которое указывает pMyArray. Чтобы выполнить сначала сложение и лишь затем переход к переменной по указателю, следует использовать скобки. Выражение *( pMyArray+n ) возвращает элемент, который находится по адресу pMyArray плюс n элементов. В действительности соответствие между двумя формами выражений настолько строго, что C++ рассматривает элемент массива myArray [n] как *( pMyArray+n ), где pMyArray указывает на первый элемент массива myArray. C++ интерпретирует myArray [n] как *(& myArray [0]+n). Таким образом, если дано int myArray [20], то myArray определяется как & myArray [0]. Имя массива, записанное без индекса элемента, интерпретируется как адрес нулевого элемента массива (или просто адрес массива). Таким образом, можно упростить приведенную ранее запись, поскольку myArray [n] С++ интерпретирует как *( myArray + n).
Слайд 9
Использование операций над указателями для адресации внутри массива Вывод массива без использования указателей: Вывод массива с использованием указателей:
Слайд 10
Этот вариант функции displayArray () начинается с создания указателя на первый элемент массива ar. После этого функция считывает все элементы массива по порядку. При каждом выполнении оператора for происходит вывод текущего элемента из массива ar. Этот элемент находится по адресу pAr, который (адрес) увеличивается на единицу при каждом выполнении цикла. Использование указателей – более распространенная практика, чем работа с массивами. Можно даже обращаться к элементу массива через указатель, НЕ разыменовывая его: Чтобы получить адреса элементов, нужно использовать &
Слайд 12
Передача массива как константы в функцию Во многих случаях предпочтительно, чтобы функция принимала параметры и сохраняла их в константах. Это может понадобиться, например, для того, чтобы разные программисты, использующие эту функцию в своих программах, могли быть уверены, что данные, переданные в функцию в качестве параметров, не будут изменены : int* const a – это указатель на массив целых чисел. Параметры, передаваемые в функцию, становятся константами. Теперь в функции fillArray () нельзя изменить значение size и нельзя в a выделить память для нового массива: Если сделать константой еще и указатель, то вообще нельзя будет даже заполнить массив: