Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С_глава1.doc
Скачиваний:
2
Добавлен:
16.12.2018
Размер:
548.86 Кб
Скачать

Присваивание указателей

Можно присваивать один указатель другому. Однако эта операция имеет смысл только в том случае, если оба указателя являются указателями на объекты одного и того же типа.

Пример присваивания указателей.

#include <stdio.h>

int main()

{

int j =12525, *p1, *p2;

p1=&j;

p2=p1; // Присваивание указателей

printf(“%d\n”, *p1); // Оба оператора напечатают одно и то же

printf(“%d\n”, *p2);

return 0;

}

Сравнение указателей

Можно сравнивать два указателя, если они указывают на один и тот же объект. Если же они указывают на разные объекты, то их можно проверить только на несовпадение.

Пример сравнения на неравенство указателей.

#include <stdio.h>

int main()

{

int a,b;

int *p1, *p2;

p1=&a;

p2=&b; // Указатели p1 и p2 не равны, так как они указывают на

// разные объекты

if (p1 != p2) printf (“Указатели p1 и p2 не равны \n”);

else printf(“Эта строка не напечатается \n”);

return 0;

}

Операция new

Условно можно разделить всю память на 2 вида: автоматически распределяемую при работе программы (например, при объявлении переменной int a[10]; автоматически выделяется 10 ячеек памяти, каждая из которых предназначена для хранения целого значения) и свободную или динамически распределяемую. Доступ к ячейкам свободной памяти осуществляется посредством указателя, хранящего адрес нужной ячейки. Для выделения памяти в области динамического распределения используется ключевое слово new. Формат для выделения переменной

new имя_ типа;

Например, new int; выделит два байта памяти, а new long; четыре байта. В качестве результата оператор new возвращает адрес выделенного фрагмента памяти. Этот адрес должен присваиваться указателю.

Примеры.

unsigned short int *ps;

ps = new unsigned short int;

Теперь ps указывает на ячейку памяти, достаточную для хранения значения типа unsigned short int, и туда можно занести какое-нибудь значение: *ps = 72;

float *pa;

Операция delete

Когда память, выделенная под переменную, больше не нужна, ее следует освободить. Делается это с помощью оператора delete:

delete имя_указателя;

Примеры.

delete ps;

Повторное применение оператора delete к тому же самому указателю приведет к зависанию программы. Рекомендуется при освобождении памяти присваивать связанному с ней указателю нулевое значение. Повторный вызов оператора delete для нулевого указателя пройдет безболезненно для программы, например,

char *pc;

pc = new char;

*pc = 'a';

delete pc;

pc = NULL;

delete pc;

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

При невнимательной работе с указателями может возникнуть эффект утечки памяти. Это происходит, если указателю присваивается новое значение, а память, на которую он ссылался, не освобождается. Каждый раз, когда в программе используется оператор new, за ним должен следовать оператор delete.

Пример утечки памяти.

int *pi = new int; // Выделение памяти для хранения переменной типа int

*pi=72; // В выделенную память записывается значение 72

pi = new int; // Выделение новой области памяти

*pi =84; // Запись в новую область значения 84

После выполнения этих операторов память, содержащая значение 72, оказывается недоступной, поскольку указателю на эту область было присвоено новое значение. В результате невозможно ни использовать, ни освободить зарезервированную память до завершения программы (когда вся выделенная память освобождается автоматически).

Пример выделения, использования и освобождения динамической памяти.

#include <stdio.h>

int main()

{

int a=5;

int * pa = &a;

int *pheap = new int; // Выделение памяти под целую переменную

*pheap = 7;

printf(“a=%d, *pa =%d, *pheap=%d \n”, a, *pa, *pheap);

delete pheap; // Освобождение памяти, выделенной оператором new

pheap =pa; // Присвоение указателю нового значения

printf(“ *pheap=%d \n”, *pheap);

return 0;

}