Определение адреса и разыменования.
Если
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));
}