# 9. Понятие указателя, типизированные и нетипизированные указатели, указатель на функцию.

## Указатель

**Указатель** – это переменная, значением которой является адрес в памяти. Указатель занимает 4 байта (или иную память равную int) памяти вне зависимости от типа данных, на который указывает.

```c
ptr = &nurse; //указатель на nurse
val = *ptr; //присваивает val значение, хранящееся в ячейке ptr
```

:star:Висячий указатель - указатель в никуда

## Типизированные и нетипизированные указатели <a href="#tipizirovannye-i-netipizirovannye-ukazateli" id="tipizirovannye-i-netipizirovannye-ukazateli"></a>

**Типизированные указатели** - те, которые могут указывать только на заданный тип данных.

Существуют также **нетипизированные указатели** (void\*), способные указывать на любой тип данных.

## Указатель на функцию

Указатель на функцию представляет собой переменную, значением которой является адрес функции.

`void function (char *);`&#x20;

Тип function() определен как "функция с параметром char \* и возвращаемым типом void".

`void (*pf)(char *); //pf - указатель на функцию`

## Операции над/с указателями: <a href="#operacii-nad-s-ukazatelyami" id="operacii-nad-s-ukazatelyami"></a>

1. Разыменование (\*p) - получение значения по адресу, хранящемуся в ячейке, на которую указывает указатель;
2. Сложение и вычитание с целыми числами
3. Операции сравнения (для указателей одного типа)
4. Присваивание (\&a) - взятие адреса переменной

## Указатели и константы

**Указатель на константу** – Значение переменной нельзя изменить через указатель, но можно изменить адрес на который указывает указатель.

**Константный указатель** может изменять значение по адресу, но не может изменять адрес.

**Константный указатель на константу** не может изменять ни значение, ни адрес.

```cpp
int a = 10;
const int *p1 = &a;    //указатель на константу
int const *p2 = &a;    //указатель на константу
*p1 = 20; //ошибка
p2 = 0;   //OK

int *const p3 = &a;    //константный указатель
*p3 = 30; //ОК
p3 = 0;   //ошибка

int const *const p4 = &a; //константный указатель на константу
*p4 = 30; //ошибка
p4 = 0;   //ошибка
```
