
Билет №11.
Указатели. Арифметика указателей.
Язык С++ обладает развитыми средствами адресации.
Указатели применяются:
1)при динамическом выделении памяти;
2)при работе с файлами;
3)при работе с многомерными массивами;
4)можно использовать указатель на функцию и передавать её в качестве аргумента в другую функцию.
Тип адресуемый указателем определяет число байт, извлекаемых из памяти при выполнении операции разадресации. Указатель всегда должен указывать на объект того типа, с которым он объявлен, в противном случае использование такого указателя может привести к бессмысленному результату.
Указатель на неопределенный тип.
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)поразрядные операции с указателями.
Билет №12.
Динамические переменные.
Динамическое выделение памяти необходимо для эффективного использования памяти компьютера. Например, мы написали какую-то программку, которая обрабатывает массив. При написании данной программы необходимо было объявить массив, то есть задать ему фиксированный размер (к примеру, от 0 до 100 элементов). Тогда данная программа будет не универсальной, ведь может обрабатывать массив размером не более 100 элементов. А если нам понадобятся всего 20 элементов, но в памяти выделится место под 100 элементов, ведь объявление массива было статическим, а такое использование памяти крайне не эффективно.
В С++ операции new и delete предназначены для динамического распределения памяти компьютера. Операция new выделяет память из области свободной памяти, а операция delete высвобождает выделенную память. Выделяемая память, после её использования должна высвобождаться, поэтому операции new и delete используются парами. Даже если не высвобождать память явно, то она освободится ресурсами ОС по завершению работы программы. Рекомендую все-таки не забывать про операцию delete.
// пример использования операции new
int *ptrvalue = new int;
//где ptrvalue – указатель на выделенный участок памяти типа int
//new – операция выделения свободной памяти под создаваемый объект.
Операция new создает объект заданного типа, выделяет ему память и возвращает указатель правильного типа на данный участок памяти. Если память невозможно выделить, например, в случае отсутствия свободных участков, то возвращается нулевой указатель, то есть указатель вернет значение 0. Выделение памяти возможно под любой тип данных: int, float,double, char и т. д.
// пример использования операции delete:
delete ptrvalue;
// где ptrvalue – указатель на выделенный участок памяти типа int
// delete – операция высвобождения памяти
Разработаем программу, в которой будет создаваться динамическая переменная.
// new_delete.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int *ptrvalue = new int; // динамическое выделение памяти под объект типа int
*ptrvalue = 9; // инициализация объекта через указатель
//int *ptrvalue = new int (9); инициализация может выполнятся сразу при объявлении динамического объекта
cout << "ptrvalue = " << *ptrvalue << endl;
delete ptrvalue; // высвобождение памяти
system("pause");
return 0;
}
В строке 8 показан способ объявления и инициализации девяткой динамического объекта, все, что нужно так это указать значение в круглых скобочках после типа данных.