8 Указатели и адресная арифметика. Преобразование указателей. Связь указателей и массивов.

Язык С++ обладает развитыми средствами адресации.

Указатели применяются:

1)при динамическом выделении памяти;

2)при работе с файлами;

3)при работе с многомерными массивами;

4)можно использовать указатель на функцию и передавать её в качестве аргумента в другую функцию.

char c;

char *Ptr;

Ptr=&c;

*Ptr=’A’;

Тип адресуемый указателем определяет число байт, извлекаемых из памяти при выполнении операции разадресации. Указатель всегда должен указывать на объект того типа, с которым  он объявлен, в противном случае использование такого указателя может привести к бессмысленному результату.

float F;

short *Ptr;

short A;

F=100.25;

Ptr=(int*)&F;

A=*Ptr;

На самом деле Ptr будет указывать на:

0(10000101)10010001000

32      23 22

A=-32768

Указатель на неопределенный тип.

void *Ptr;

Пример:

int A;

int B;

float F=5.2, G;

void *Ptr;

Ptr=&A; B=(int*)Ptr; //B=A

Ptr=&F; G=(float*)Ptr; //G=F

Использование указателей в арифметических операциях.

Над указателями можно производить операции: ++; --; +; -

Пример1:

тип *Ptr;

Ptr--=знач.Ptr - sizeof(тип);

Пример2:

тип * Ptr;

Ptr+число=знач.Ptr + число*sizeof(тип);

Недопустимые операции с указателями:

1)сложение и вычитание 2-х указателей;

2)сложение и вычитание указателя с числом с ПТ;

3)умножение и деление указателей;

4)поразрядные операции с указателями.

Преобразования типов.

Указатель на один тип может быть преобразован к указателю на другой тип.

Пример:

long A=65535;

short *pA=(short*)&A;

short B=*pA; //B=-1

Связь указателей и массивов:

int M[10]; //идентификатор М является одновременно указателем.

int *Ptr;

Ptr=M; Ptr=&M[0]; - эквивалентные операции.

int A=Ptr[5]; A=*(Ptr+5); - эквивалентные операции.

начало присваивание А 6-го элемента массива М.

A=M[5];

A=5[M];   

A=*(M+5);

A=*(5+M);

конец присваивание А 6-го элемента массива М.

int M[5][6][7];

int *Ptr;

Ptr=M;

int A=M[i][j][k];

A=*(Ptr+i*6*7+j*7+k);

Hosted by uCoz