Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / LECS6.DOC
Скачиваний:
47
Добавлен:
16.04.2013
Размер:
57 Кб
Скачать
☆

Типы указателей.

Указатели в Си++ используются для связи переменных с «машинными» адресами.

Если 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));

}

Соседние файлы в папке Лекции