Определение адреса и разыменования.
Если p – указатель, то *р – это значение, находящееся по адресу, который хранится в указателе р.
Рассмотрим примеры:
Int i=5;j;
Int*p=8i; //указатель инициализирован адресом переменной i
Cout<<*p<<”=i, хранится по адресу”endl;
J=p: // недопустимо, указатель не преобразуется в целое
J=*p+1; //допустимо
p=8j; // теперь р указывает на j
При обращении к функции указатели могут передаваться в качестве аргументов.
//вызов по ссылке на основе указателей
void order (int*, int*);
int main()
{ int i=7, j=3;
cout<<i<<’\t’<<j<<endl; //напечатается 7и3
order (&, &j );
cout<<i<<’\t’<<j<<endl; //напечатаются 3 7
}
void order (int*p, int*q)
{ int temp;
if (*p>*q) {
temp=*p;
*p=*q;
*q=temp;
}
}
Применение void.
Ключевое слово void используется как возвращаемый тип функции, не возвращающей значения. Для указателей void используется для объявления обобщенного указателя (void*p;). Такому указателю можно присвоить адрес переменной любого типа, но он не может быть разыменован.
void*gp; // обобщенный указатель
int*ip; // указатель на int
char*cp // указатель char
gp=ip; // допустимо
cp=ip // не допустимо
*ip=15 // допустимо
*ip=*gp; // недопустимо разыменование gp
ip=static_cast<int*>(gp); //допустимо
Рассмотрим еще пример 9.2.
/* использование указателя на void для адресации буфера */
#include <stdio.h>
#include <dos.h>
void DispPointer(void *p);
main()
{
char buffer[1024];
void *bp;
bp = &buffer; /* присваивание адреса буфера указателю bp */
*(char *)bp = 'A'; /* запоминание символа через указатель */
buffer[1] = 'B'; /* прямое запоминание символа */
buffer[2] = 0; /* вставка нуля после "AB" */
printf("Address of buffer == ");
DispPointer(&buffer);
printf("Data in buffer == %s", (char *)bp);
return 0;
}
void DispPointer(void *p)
{
printf("%04x:%04x\n", FP_SEG(p), FP_OFF(p));
}