Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Языки программирования.docx
Скачиваний:
28
Добавлен:
17.03.2015
Размер:
50.42 Кб
Скачать

Инициализация указателей.

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

Floatf, *fp=&f;

Chars[80], *sp=s;

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

Существует специальный тип указателей на неопределенный тип. Объявление такого указателя имеет вид:

void*имя;

пример:

void*ptr;

служебное слово voidв определении указателя позволяет отсрочить определение типа объекта, на который он указывает. Указатель на типvoidможно использовать для ссылки на объект любого типа, но для этого следует использовать операцию приведения типа указателя, который имеет вид: (тип*) указатель.

приведение указателей к определенному типу:

main (void){

int a=123;

double d=3.4567;

void *vp;

vp=za;

printf(‘’a=%d”,*(int (*)vp);

vp=&d;

printf(“d=%f”, *((double)vp);

a=123;d=3.4567;

Выражения с указателями.

Можно присваивать один указатель другому. Но эта операция имеет смысл, если оба указателя имеют один и тот же тип. Приоритет у унарной операции разадресации * выше, чем у бинарных арифметических операций.

Int x=5, y,*px=&x;

Y=*px+5;

Операции с указателями.

++

--

+,- с указателями можно использовать только эти операции. Если к указателю применяется ++ или --, то указатель увеличивается или уменьшается на размер объекта, который он адресует.

В C++ есть операцияsizeoff(тип);

Данная операция возвращает количество занимаемых типом байт.

Пример:

Int I, *pi=&I;

Float a, *pa=&a;

Pi++;

Pa++;

Один из операндов операции сложения может быть указателем. Другой должен быть целым числом. Пример: floata, *pa=&a;

Pa=pa+3;

Для «-» аналогично.

Указатели и массивы.

Между указателями и массивами прямая связь. Когда появляется массив, например, intarr[5]

То идентификатор массива artопределяется как константный указатель на первый элемент массива, это означает, что имя массива содержит адрес первого элемента

Int *parr;

Parr=arr;

Int I;

Int a[10];

Int *pa=a;

For(i=0;i<10;i++){

Printf(“введите элемент массива”);

Scanf(“%d”, Pa+i);

}

For(i=0;i<10;i++)

Printf(“%d”, *(pa+i));

Динамические переменные удобно использовать, если программе нужно работать с массивом, размер которого заранее неизвестен. Для этого используются такие функции, как mallocиcalloc<malloc.h>.

Fp=(float(*)malloc(16))

В круглых скобках задается число выделяемых байт.

Функция mallocвозвращает указатель на типvoid. Поэтому необходимо выполнять приведение.

Возвращаемое значение функции mallocэто значение адреса первого элемента выделенного блока памяти. Функцияcallocаналогична, но нужно объявлять 2 аргумента.

Функция callocобнуляет каждый байт выделенной памяти. И устанавливает ему значение 0.

Функция new.

Указатель = newтип указателя;

P_var=newtype

Для массива:

Указатель = newтип [размер];

Int *p_array=new int[5];

Строится на функциях malloc.

Malloc и callocв случае ошибки возвращаетnull.

Удаление памяти.

По окончании работы с выделенным блоком памяти ее следует освободить, чтобы mallocиcallocснова могли ей воспользоваться. Если ее не освободить, то ее нельзя будет использовать до конца работы программы. Освобождается память функциейfree(); для функцииnewлюбая память освобождается функциейdelete.

2 типа освобождения памяти:

Deletep;

Int *p=new int[];

Delete [] p;