Содержание
- 2. Адресная функция Векторная память поддерживается почти всеми языками высокого уровня и предназначена для хранения массивов различной
- 3. Адресная функция Тогда справедливо следующее: A(i, j) ↔ B(K(i, j)) = B(N1), B – одномерный массив
- 4. Адресная функция Аналогично получаем адресную функцию для трехмерного массива Х(n1, n2, n3): K(i, j, k) =
- 5. Работа с динамической памятью Указатели чаще всего используют при работе с динамической памятью, которую иногда называют
- 6. Библиотечные функции Функции для манипулирования динамической памятью в стандарте Си void *calloc(unsigned n, unsigned size); –
- 7. Динамический массив В языке Си размерность массива при объявлении должна задаваться константным выражением. Если до выполнения
- 8. Динамический массив Обращение к элементу динамического массива осуществляется так же, как и к элементу обычного –
- 9. Динамический массив #include void main() { double *x; int n; printf("\nВведите размер массива – "); scanf("%d",
- 11. Скачать презентацию
Адресная функция
Векторная память поддерживается почти всеми языками высокого уровня и предназначена
Адресная функция
Векторная память поддерживается почти всеми языками высокого уровня и предназначена
Элементы, например, двухмерного массива X размерностью n1×n2 размещаются в оперативной памяти в следующей последовательности:
Х(0,0), Х(0,1), Х(0,2),... Х(0, n2–1), ..., Х(1,0), Х(1,1), Х(1,2),... Х(1, n2–1), ..., Х(n1–1,0), Х(n1–1,1), Х(n1–1,2), ..., Х(n1–1, n2–1).
Адресация элементов массива определяется некоторой адресной функцией, связывающей адрес и индексы элемента.
Пример адресной функции для массива Х:
K(i, j) = n2*i + j;
где i = 0,1,2,... ,(n1–1); j = 0,1,2,... ,(n2–1);
j – изменяется в первую очередь
Адресная функция двухмерного массива A(n,m) будет выглядеть так:
N1 = K(i, j) = m*i + j,
i=0,1,..., n–1; j=0,1,... , m–1 .
Адресная функция
Тогда справедливо следующее:
A(i, j) ↔ B(K(i, j)) = B(N1),
B
Адресная функция
Тогда справедливо следующее:
A(i, j) ↔ B(K(i, j)) = B(N1),
B
Например, для двухмерного массива A(2,3) имеем:
Проведем расчеты:
i = 0, j = 0 N1 = 3*0+0 = 0 B(0)
i = 0, j = 1 N1 = 3*0+1 = 1 B(1)
i = 0, j = 2 N1 = 3*0+2 = 2 B(2)
i = 1, j = 0 N1 = 3*1+0 = 3 B(3)
i = 1, j = 1 N1 = 3*1+1 = 4 B(4)
i = 1, j = 2 N1 = 3*1+2 = 5 B(5)
Адресная функция
Аналогично получаем адресную функцию для трехмерного массива Х(n1, n2, n3):
K(i,
Адресная функция
Аналогично получаем адресную функцию для трехмерного массива Х(n1, n2, n3):
K(i,
где i = 0,1,2,... ,(n1–1); j = 0,1,2,... ,(n2–1); ); k = 0,1,2,... ,(n3–1);
значение k – изменяется в первую очередь.
Для размещения такого массива потребуется участок оперативной памяти размером (n1*n2*n3)*sizeof(type). Рассматривая такую область как одномерный массив Y(0,1,..., n1*n2*n3), можно установить соответствие между элементом трехмерного массива X и элементом одномерного массива Y:
X(i, j, k) ↔ Y(K(i, j, k)) .
Необходимость введения адресных функций возникает лишь в случаях, когда требуется изменить способ отображения с учетом особенностей конкретной задачи.
Работа с динамической памятью
Указатели чаще всего используют при работе с динамической
Работа с динамической памятью
Указатели чаще всего используют при работе с динамической
Некоторые задачи исключают использование структур данных фиксированного размера и требуют введения структур динамических, способных увеличивать или уменьшать свой размер уже в процессе работы программы. Основу таких структур составляют динамические переменные.
Динамическая переменная хранится в некоторой области оперативной памяти, не обозначенной именем, и обращение к ней производится через переменную-указатель.
Библиотечные функции
Функции для манипулирования динамической памятью в стандарте Си
void *calloc(unsigned n,
Библиотечные функции
Функции для манипулирования динамической памятью в стандарте Си
void *calloc(unsigned n,
void *malloc (unsigned n) – выделение области памяти для размещения блока размером n байт; возвращает указатель на выделенную область памяти;
void *realloc (void *b, unsigned n) – изменение размера размещенного по адресу b блока на новое значение n и копирование (при необходимости) содержимого блока; возвращает указатель на перераспределенную область памяти; при возникновении ошибки, например, нехватке памяти, эти функции возвращают значение NULL, что означает отсутствие адреса (нулевой адрес);
void free (void *b) – освобождение блока памяти, адресуемого указателем b
Для использования этих функций требуется подключить к программе в зависимости от среды программирования заголовочный файл alloc.h или malloc.h.
Динамический массив
В языке Си размерность массива при объявлении должна задаваться константным
Динамический массив
В языке Си размерность массива при объявлении должна задаваться константным
Если до выполнения программы неизвестно, сколько понадобится элементов массива, нужно использовать динамические массивы, т.е. при необходимости работы с массивами переменной размерности вместо массива достаточно объявить указатель требуемого типа и присвоить ему адрес свободной области памяти (захватить память).
Память под такие массивы выделяется с помощью функций mallос и calloc во время выполнения программы. Адрес начала массива хранится в переменной-указателе
int n = 10;
double *b = (double *) malloc(n * sizeof (double));
Пример
Обнуления памяти при ее выделении не происходит. Инициализировать динамический массив при декларации нельзя.
Динамический массив
Обращение к элементу динамического массива осуществляется так же, как и
Динамический массив
Обращение к элементу динамического массива осуществляется так же, как и
После работы захваченную под динамический массив память необходимо освободить, для нашего примера
free(b);
Таким образом, время жизни динамического массива, как и любой динамической переменной – с момента выделения памяти до момента ее освобождения. Область действия элементов массива зависит от места декларации указателя, через который производится работа с его элементами. Область действия и время жизни указателей подчиняются общим правилам для остальных объектов программы.
Динамический массив
#include
void main()
{
double *x;
int n;
printf("\nВведите размер массива – ");
scanf("%d",
Динамический массив
#include
void main()
{
double *x;
int n;
printf("\nВведите размер массива – ");
scanf("%d",
if ((x = (double*)calloc(n, sizeof(*x)))==NULL) { // Захват памяти
puts("Ошибка ");
return;
}
...
// Работа с элементами массива
...
free(x); // Освобождение памяти
}
Пример