Каждая переменная представляется в программе своим именем и имеет значение, которое хранится в некоторой области памяти. Между именем переменной и адресом предоставляемой ей области памяти устанавливается соответствие, однако для получения значения переменной ее адрес не нужен. По имени переменной всегда можно получить её значение.


Тем не менее адрес любой переменной (кроме регистровых) доступен с помощью операции &. Выражение &x - адрес участка памяти, занимаемой значением переменной х.

Ассоциативная связь

Чтобы работать с адресами, их нужно уметь сохранять. Для этой цели и служат указатели.


Указатель – переменная, значением которой является адрес объекта конкретного типа.

int *a, n; a=&n; *a=10;

float *b; …..

char *c; …..

void *f; …..


Над указателями можно производить следующие операции:

int *a, *b, n, c, *d;


a=&n - присваивание указателю адреса переменной;

b=a - присваивание значения одного указателя другому;

*b (с=*b; *b=25) - получение значения того объекта, на который ссылается указатель (

d=&a - получение адреса самого указателя

a==b - сравнение указателей

a++ (a--) - инкремент (декремент)

a+4 (a-8) - увеличение (уменьшение) на целое

a-d - разность указателей


При объявлении указателя на объект выделяется память только для указателя!


Если мы хотим размещать объекты в памяти во время исполнения программы, то для этого следует использовать специальные функции. При этом вновь создаваемые объекты будут размещаться в так называемой динамической памяти.


Динамическая память:


float *t;


Мы объявили указатель на float. Для хранения его значения в статической памяти будет выделено 4 байта.


t=(float *)malloc (n*sizeof(float));


С помощью фунции malloc мы запросили в динамической памяти участок для размещения n вещественных чисел. Адрес этого участка будет присвоен переменной t.


Функции для выделения и освобождения памяти:


void* free(void* bl);