Язык С++ обладает развитыми средствами адресации.
Указатели применяются:
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);