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

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Указатель есть адрес некоторого объекта. Если p указатель на объект, то *p есть сам объект. Адрес объекта возвращает оператор &, который ставится перед именем объекта.
В языке C++ можно определять переменные, значениями которых являются адреса других переменных. Такие переменные называются указателями. Для объявления указателя после имени типа ставится *, например,
int *pi; //pi указатель на переменную целого типа
Существует унарный оператор &, выдающий адрес своего операнда. После выполнения инструкций
int i = 0;
pi = &i;
указатель pi будет содержать адрес переменной i (говорят, что pi ссылается на i). Схема расположения в памяти переменной i и указателя pi, содержащего ее адрес, показана на рис.. Целая переменная i занимает два байта памяти, а указатель pi четыре. Такое количество памяти выделяется под указатели на так называемых 32 разрядных компьютерах, в которых для формирования адресов используется 4 байта, состоящих из 8 двоичных разрядов битов.
Рис.. Связь объекта и указателя на него
Унарный оператор * применяется к указателю и выдает объект, на который ссылается данный указатель, например,
*pi = 2; //Теперь i = 2
Иначе говоря, если pi указывает на i, то выражение *pi и i это одно и то же.
Можно создавать указатели на величины любых типов.
Взаимодействие формальных параметров и фактических аргументов функции triangle иллюстрируется рис.. При вызове функции формальные параметры a, b, c получают значения фактических аргументов r, s, t; формальные параметры p_perim, p_area получают значения адресов внешних переменных P и S.
Рис.. Формальные параметры a, b, c получают значения внешних переменных r, s, t. Формальные параметры p_perim и p_area получают значения адресов внешних переменных P и S
Определение
int a[10];
создает массив из 10 элементов, то есть блок из 10 расположенных последовательно объектов с именами a[0], a[1], …, a[9].
Рис.. Массива в памяти и указатели на элементы массива
Пусть определен указатель
int *pa;
После присваивания pa = &a[0] указатель pa будет содержать адрес первого элемента массива a. На рис. это показано стрелкой, причем для pa нарисован прямоугольник, чтобы подчеркнуть, что этот указатель размещен где-то в памяти.
По определению pa+1 указывает на следующий элемент массива, pa+i указывает на i-й элемент после pa, pa-i указывает на i-й элемент перед pa. Для выражений pa+1, pa+2 на рисунке прямоугольники не нарисованы, так как под них память не выделяется. Имея указатель на начало массива, можно получить доступ к любому его элементу, например, *pa есть нулевой элемент массива, *(pa+1) первый и т.д. Присваивание
*(pa+1)= 0;
зануляет первый элемент массива.
По определению значение переменной или выражения типа массив есть адрес нулевого элемента массива, поэтому имя массива имеет тип указателя на элемент массива, например, a имеет тип int*. Доступ к i-му элементу массива можно получить, используя индексацию a[i] или выражение *(a+i).
Указатель это переменная, которой можно присваивать различные значения, например, pa=a+1. Теперь pa указывает на первый элемент массива a. Имя массива не является переменной, так как содержит адрес конкретного участка памяти, и записи типа a=pa, a++ недопустимы. Значение имени массива изменить нельзя, во всем остальном имя массива подобно указателю.
Как уже говорилось, указатели можно складывать и вычитать с целыми. Если p указатель на некоторый элемент массива, то выражение p++ изменяет p так, чтобы он указывал на следующий элемент массива. Выражение p+=i изменяет p так, чтобы он указывал на i-й элемент, после того, на который он указывал ранее.
Если p и q указывают на элементы одного и того же массива, то к ним можно применять операторы сравнения ==, !=, <, <=, >, >=. Выражение p < q истинно, если p указывает на более ранний элемент массива, чем q.
Любой указатель можно сравнивать на равенство и неравенство с нулем. Если значение указателя равно нулю, это трактуется так, что указатель никуда не указывает.
Допускается вычитание указателей. Если p и q указывают на элементы одного и того же массива и p < q, то q - p +1 есть число элементов от p до q включительно.
Для работы со строками символов часто используются указатели на char. Их определение имеет вид:
char* pc;
Строковая константа, написанная в виде “Я строка” есть массив символов. Во внутреннем представлении этот массив заканчивается нулевым символом \0, по которому программа может найти конец строки. Адрес начала массива, в котором расположена строковая константа, можно присвоить указателю путем присваивания
pc = ”Я строка”;
Здесь копируется только адрес начала строки, сами символы не копируются. Указатель на строку можно использовать там, где требуются строки. Например, при выполнении следующей строки программы
cout << pc << ” длиной ” << strlen(pc) << ”символов”;
будет напечатано
Я строка длиной 8 символов
При подсчете символов строки учитываются и пробелы, а завершающий символ \0 не учитывается.
Указатели, как и любые другие переменные, можно группировать в массивы. Удобно, например, использовать массив символьных указателей при работе с несколькими строками, которые могут иметь различную длину.
pi
ii
···
··
r
s
t
P
S
main
a
b
c
p_perim
p_area
triangle
a:
a[0]
a[1]
a[9]
pa
pa+1
pa+2