Преобразование указателей
Указатель на данные одного типа может быть преобразован в указатель на данные другого типа. Однако при этом следует учитывать, что данные, адресуемые преобразованным указателем, будут интерпретироваться по-новому (может измениться их размер, а, следовательно, и значение). Преобразование указателей выполняется операцией приведения типа:
( тип *) указатель
Например, операторы:
short int i = 0x1010; // Это десятичное 1*4096+ 1*16 = 4112
short *ptr = &i;
short int j = *ptr;
short int k = *(char*)ptr;
приведут к созданию переменной j с начальным значением 0x1010 и переменной k с начальным значением 0x10.
Бестиповые указатели
Бестиповый указатель (указатель на неопределенный тип) позволяет отсрочить определение типа, на который ссылается указатель, или использовать один указатель для обращения к данным разных типов. При объявлении такого указателя вместо типа адресуемых им данных указывается ключевое слово void:
void * имя_указателя ;
Переменная, объявленная как указатель на тип void, может быть использована для работы с данными любого типа. Но для того, чтобы оперировать бестиповым указателем или данными, которые он адресует, необходимо явно указать требуемый тип в каждой операции с таким указателем. Это можно сделать с помощью операции приведения типа:
int a = 125;
double d = 10.3975;
short b[4] = {0, 1, 2, 3};
void *vp;
. . .
vp = &a;
cout << *(int*)vp << endl; // Вывод значения переменной a
vp = &d;
cout << *(double*)vp << endl; // Вывод значения переменной d
vp = b;
cout << *((short*)vp+1) << endl; // Вывод значения b[1]
vp = (short*)vp+2; // Изменение значения vp
cout << *(short*)vp << endl; // Вывод значения b[2]
Переменная vp объявлена как бестиповый указатель, поэтому ей можно присвоить адрес переменной любого типа. Однако ни одна операция не может быть выполнена над бестиповым указателем до тех пор, пока не будет явно задан тип данных, на который он указывает. В примере указатель vp с помощью операции приведения типа преобразуется к типам int*, double* и short*.
Массив указателей
Указатели, как и любые другие данные одного и того же типа, могут объединяться в массивы. Массивы указателей можно использовать для работы со всеми типами данных, но целесообразнее применять их для хранения символьных строк.
Объявление
char *ch[10];
означает, что ch – одномерный массив из 10 элементов, являющихся указателями на данные типа char.
Определить и инициализировать массив строк (массив указателей на данные типа char) можно, например, с помощью объявления
char* s[5] = { "one", "two", "three", "four", "five" };
или равнозначного ему
char* s[] = { "one", "two", "three", "four", "five" };
Оба приведенных в примере объявления создают массив указателей s и инициализируют его элементы адресами константных строк. Так как s – массив, указатель s будет содержать адрес начального элемента этого массива, в данном случае – указателя s[0], а каждый из указателей s[0], … , s[4] – адрес начала соответствующей строки. Соответственно, *s, как и s[0], будет означать адрес начала первой по счету строки массива s, а s[0][0], *s[0] (приоритет операции [] выше, чем приоритет операции *) и **s – значение ее начального символа.
Дата добавления: 2015-11-10; просмотров: 818;