Читайте также: |
|
Синтаксис объявления указателя:
имя_типа_данных * имя указателя;
Например:
int *pi;
int i, * IntPoint=&i; // этот указатель, при определении, сразу же
// инициализирован адресом переменной целого типа i.
char ** cpp; // указатель на указатель на char
char *menu[10]; // массив из 10 указателей на char
Указатели на массивы и функции, к сожалению, требуют более сложной
записи:
int (*vp)[10]; // указатель на массив из 10 целых
int (*fp)(char, char*); // указатель на функцию с параметрами
// char и char*, возвращающую int
Пример
#include <iostream.h>
#include <conio.h>
Void main(void)
{
int m[2][2]={1,2,3,4},(*vp)[2];
vp=m;
cout<<"\n"<<vp[0][1]; // печатается 2
Getch();
}
В данном случае все правильно, поскольку имя массива, как мы увидим в
Дальнейшем, является как бы указателем-константой на первый элемент, а первый элемент - это одномерный массив из двух элементов.
Главная операция над указателями - это косвенное обращение (разименование), то есть обращение к объекту, адрес которого хранит указатель.
Операция разименования “ * “ является префиксной унарной операцией. Например:
char c1 = 'a';
char* p = &c1; // p содержит адрес c1
char c2 = *p; // c2 = 'a'
Переменная, на которую указывает p, - это c1, а значение, которое хранится в c1, равно 'a'. Поэтому присваиваемое c2 значение *p есть 'a'.
Над указателями можно выполнять и некоторые арифметические операции.
Ниже в качестве примера представлена функция, подсчитывающая число
символов в строке, заканчивающейся нулевым символом (который не учитывается):
int strlen(char* p)
{
int i = 0;
while (*p++)
i++;
Return i;
}
Выражения с указателями
Можно присваивать значение одного указателя другому. Однако это возможно только в том случае, если они одинакового типа.
Можно сравнивать указатели одинаковых типов.
С указателями могут быть использованы только операции ++, --, +, -. При применении к указателю этих операций, происходит масштабирование размером объекта, на который указывает этот указатель, что условно можно представить так:
тип * ptr;
ptr = ptr + k; //ptr = ptr + k*sizeof(тип);
Указатель на неопределенный тип void
Специальное применение имеют указатели на тип void. Указатель на void
может указывать на объекты данных любого типа. Например:
int i:
void * p;
То можно
p=&i;
Но изменять значения такого указателя нельзя, потому что для компилятора это указатель на неизвестный тип и он не знает, как осуществлять масштабирование.
Например:
p++; // недопустимо
Можно объявить функцию с типом возвращаемого значения как указатель на void. Это возвращаемое значение может быть присвоено указателю на тот тип, который требуется.
Дата добавления: 2015-07-07; просмотров: 127 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Инициализирующие значения будут присваиваться элементам массива в порядке их | | | Связь указателей и массивов |