Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
расписанные билеты,информатика 2 семестр.docx
Скачиваний:
3
Добавлен:
25.09.2019
Размер:
111.91 Кб
Скачать

Билет 11. Динамическое распределение памяти. Размещение переменных в памяти.

В динамической памяти, как правило, размещаются переменные, которые используются эпизодически и требует большого объема памяти. В стандартной библиотеке имеются функции для управления динамической памятью. К ним относятся malloc(выделение памяти), realloc(изменение размера блока памяти) и free(освобождение памяти). В функцию malloc передается через размер требуемой памяти и она возвращает адрес выделенного блока адрес выделенного блока( или NULL если выделение невозможно). Для динамического выделения памяти в С используется библиотечная функция malloc(), которая резервирует заданный размер блока памяти и возвращает указатель на этот блок. Указатель возвращается неопределенного типа (void*), который приводится к требуемому типу данных.

int *x; int n = 100; x = (int*)malloc(n*sizeof(int)); x[0] = 10; x[1] = 20;

Функция realloc передается адрес блока и новый размер, она возвращает новый адрес, при этом старые данные копируются по новому адресу. Для перераспределения ранее выделенной памяти в С используется библиотечная функция realloc(), которая изменяет размер блока памяти.

int *x = (int*)malloc(100*sizeof(int)); ... x = (int*)realloc(x, 500*sizeof(int)); ... free(x);

В функцию free передается адрес блока, который может быть высвобожден. Для освобождения ранее выделенной памяти в С используется библиотечная функция free(), которая делает блок памяти доступным для использования в других местах программы.

int *x; int n = 100; x = (int*)malloc(n*sizeof(int)); x[0] = 10; x[1] = 20; ... free(x);

Пример работы с динамической памятью:

Int *x=(int*)malloc(10000*sizeof(int)); // выделение памяти

x[0]=10;

x[1]=20;

x=(int*)realloc(x, 20000*sizeof(int)); // изменение размера

x[19999]=x[0]+x[1]; //ячейка 19999

free(x);

В языке С++ для динамического выделения памяти может использоваться оператор new. Для освобождения памяти используется оператор delete.

Double *a=new double; // выделение памяти под тип double

int *x=new int[100]; // выделение памяти под массив int

Person *p=new Person; //выделение памяти под структуру Person

delete a; // освобождение памяти

delete[] x; // освобождение памяти массива ( с [])

delete p; // освобождение памяти

Нельзя смешивать концепции malloc/free и new/delete, поскольку при этом задействуются различные механизмы управления памятью. Т. Образом память выделенную с помощью malloc, можно высвобождать только с помощью free, а выделенную с помощью new- только с помощью delete.

int A;

int B = 999;

void f() { int C;

int *D = new int[8]; *D = A+B+C; register int i; }

Билет 12. Оператор языка с. Числовые константы. Знаковые операторы. Знаковые операторы (унарный «плюс» и унарный «минус»).

Для выполнения различных операций над переменными и константами в языке С имеется набор операторов, которые по назначению можно отнести к:1)знаковые;2) арифметические;3) присваивания; 4) отношения;5) логические;6)доступа;7) побитовые;8)прочие.

Все операторы можно систематизировать по группам в зависимости от того, со сколькими операндами они работают: 1) унитарные( один операнд);2)бинарные(два операнда); 3) тернарные( три операнда).

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

int a= -5;

float b=+45.67;

double c= -b;

Таким образом: + значение операнда без изменения знака

- значение операнда с противоположным знаком

Унитарным операторам «+» или «-» можно присваивать знаки величинам арифметических типов. Если перед величиной не указан знак, то значение по умолчанию считается положительным.

Числовые константы. Целочисленные константы могут записываться в десятичном, восьмеричном и шестнадцатеричном видах. Восьмеричные константы начинаются с нуля, шестнадцатеричные- с 0х или 0Х.

Вещественные константы включают децимальную точку и могут использовать экспоненциальный формат (e или E).

Примеры:

int a = 15; int b = 015; int c = 0x15; int d = 0X15; float e = 5.67; float f = .25; float g = 5.67e4; float h = 2E-2;

18