Типы указателей.
Указатели в Си++ используются для связи переменных с «машинными» адресами.
Если v – переменная, то &v – это адрес, или место в памяти, где хранится ее значение.
Пример объявления указателя на целое
Int*p;
Допустимая область значений:
специальный адрес 0 (обычно для указания ошибки)
положительные целые числа, которые интерпретируются как машинные адреса в зависимости от конкретной системы.
Примеры присваивания значений.
p=&i; // адрес объекта i
p=0; // нулевое значение
p=static_cast<int*> (1507); // абсолютный адрес
/* об'явление, инициализация и разыменовывание указателя */
#include <stdio.h>
char c; /* Символьная переменная */
main()
{
char *pc; /* Указатель на символьную переменную */
pc = &c;
for (c = 'A'; c <= 'Z'; c++)
printf("%c", *pc);
return 0;
}
Определение адреса и разыменования.
Если 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));
}
