Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Объявление указателя имеет следующий вид:
type *ptr;
где ptr – указатель на значение типа type;
* - символ унарной операции косвенной адресации.
Например:
int *z;//z – указатель на целое число типа int
float *a; //а – указатель на вещественное число типа float
void *p;//p – указатель на тип void (бестиповый указатель)
Указатель инициализируется либо непосредственно при объявлении (для надежности), либо после объявления с помощью оператора присваивания. При этом ему присваивается конкретный или нулевой адрес.
Например:
int x, y=5;
int *yptr, *count=NULL; //указателю count присваивается нулевой адрес
int *xptr=&x;//указателю хptr присваивается адрес переменной х
...........
yptr=&y;//указателю yptr присваивается адрес переменной y
Здесь & - символ унарной операции взятия адреса; NULL – символическая константа, равная нулевому адресу, по которому никогда не располагаются данные (этот адрес зарезервирован операционной системой для своих нужд).
Для того чтобы использовать значение, на которое указывает указатель, необходимо применить к указателю унарную операцию разыменования * (обращения по адресу).
Например:
x=*yptr;//присваивание числа y=5, находящегося по адресу yptr
Этот же результат можно получить, записав
x=y; // обычное присваивание без применения указателя
или
*xptr=*yptr;//по адресу xptr помещается значение,
//расположенное по адресу yptr
Операцию * нельзя применять к бестиповому указателю, так как неизвестно какой размер памяти нужно разыменовать. Прежде чем использовать такой указатель, ему необходимо присвоить значение указателя на нужный тип данных.
Например:
float *d, c=2; void *q;
q=d;//указатель q и d - синонимы указывают на тип float
*q=c; // по адресу q помещается значение с типа float
Указатель может изменять свое значение, т.е. ему можно присвоить адрес другой переменной того же типа.
Например:
yptr=&x; //yptr будет указывать на х
Подобно другим переменным указатель имеет собственный адрес в памяти. Он может быть получен путем применения операции & к имени указателя.
Например:
cout<<&yptr;//печать адреса указателя yptr
Можно так же определить указатель на указатель и так далее сколько нужно раз.
Например:
int z=37;
int *pz=&z; //pz – указатель на z
int **ppz=&pz; //ppz – указатель на указатель pz
В данном случае при вызове **ppz последовательно обеспечивается доступ к участку памяти *ppz= =pz, затем *pz= =z, т.е. **ppz дает значение 37.
С указателями можно выполнять не только операции присваивания и обращения по адресу, но и ряд других операций:
¨ унарные операции ++,--;
¨ аддитивные и составные операции с целыми числами +, -, +=, -=;
¨ вычитание указателей (сложение указателей запрещено);
¨ операции отношения.
Последние имеют смысл в основном при работе со структурами данных, последовательно размещенными в памяти, например с массивами.Исключение составляют операции == и!=, которые используются для любых типизированных указателей.
Массивы и указатели в С++ тесно связаны и могут быть использованы практически эквивалентно. Имя массива можно понимать как константный указатель на первый элемент массива. Его отличие от обычного указателя в том, что его нельзя модифицировать. Однако константный указатель можно присваивать переменной типа указатель.
Например:
int b[5], *pt;
pt=b; //эта запись эквивалентна pt=&b[0]
После инициализации указателя его можно использовать для ссылок на элементы массива b[i] с помощью записи *(pt+i). Указатели можно индексировать точно так же, как и массивы. Например, выражение pt[i] ссылается на элемент массива b[i]. Учитывая, что b=&b[0], в целом можно считать, что b[i] – индексированный указатель. Эта взаимосвязь отражена графически на рис. 7.1.
Рис. 7.1. Взаимосвязь указателя с одномерным массивом
Двумерные массивы заданной размерности располагаются в памяти подобно одномерным массивам, занимая построчно смежные ячейки. Поэтому для работы с таким массивом достаточно одного указателя.
Например:
float mas [4] [2], *ptr;
ptr=mas; // или ptr=& mas[0] [0]
На рис. 7.2 представлена схема расположения массива mas в памяти компьютера.
Рис. 7.2. Взаимосвязь указателя и двумерного массива
Применение указателей затрудняет составление и анализ программ, поэтому их используют в тех случаях, где без них невозможно обойтись или когда они позволяют создать более оптимальный по ряду характеристик программный код.
Возможности и преимущества указателей проявляются при работе с динамическими массивами, функциями, строками и структурированными данными.
Дата публикования: 2014-11-02; Прочитано: 265 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!