Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lektsii_po_si.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
71.13 Кб
Скачать

Одномерный динамический массив.

// объявление одномерного динамического массива на 10 элементов:

float *ptrarray = new float [10];

//  где ptrarray  – указатель на выделенный участок памяти под массив вещественных чисел  типа float

//      в квадратных скобочках указываем размер массива

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

// высвобождение памяти отводимой под одномерный динамический массив:

delete [] ptrarray;

Пример:

#include <stdio.h> #include <malloc.h> #include <stdlib.h> void main() {

  int *a;  // указатель на массив

  int i, n;

  system("chcp 1251");

  system("cls");

  printf("Введите размер массива: ");

  scanf("%d", &n);

  // Выделение памяти

  a = (int*) malloc(n*sizeof(int));

  // Ввод элементов массива

  for(i=0; i<n; i++)

    {

      printf("a[%d] = ", i);

      scanf("%d", &a[i]);

    }

  // Вывод элементов массива

  for(i=0; i<n; i++)

    printf("%d ", a[i]);

  free(a);

  getchar();   getchar(); }

Результат выполнения:

Введите размер массива: 5

a[0]=4

a[1]=7

a[2]=3

a[3]=2

a[4]=1

4 7 3 2 1

Двумерный динамический массив.

// объявление двумерного динамического массива на 10 элементов:

float **ptrarray = new float* [2]; // две строки в массиве

    for (int count = 0; count < 2; count++)

        ptrarray[count] = new float [5]; // и пять столбцов

//  где ptrarray  – массив указателей на выделенный участок памяти под массив вещественных чисел  типа float

Сначала объявляется указатель второго  порядка float **ptrarray, который ссылается на массив указателей  float* [2], где размер массива равен двумПосле чего в цикле for каждой строке массива объявленного в строке 2 выделяется память под пять элементов. В результате получается двумерный динамический массив  ptrarray[2][5]. Рассмотрим пример высвобождения памяти отводимой под двумерный динамический массив.

// высвобождение памяти отводимой под двумерный динамический массив:

    for (int count = 0; count < 2; count++)

        delete [] ptrarray[count];

//      где 2 – количество строк в массиве

Пример:

#include <stdio.h> #include <malloc.h> #include <stdlib.h> void main() {

  int *a;  // указатель на массив

  int i, j, n, m;

  system("chcp 1251");

  system("cls");

  printf("Введите количество строк: ");

  scanf("%d", &n);

  printf("Введите количество столбцов: ");

  scanf("%d", &m);

  // Выделение памяти

  a = (int*) malloc(n*m*sizeof(int));

  // Ввод элементов массива

  for(i=0; i<n; i++)  // цикл по строкам

   {

    for(j=0; j<m; j++)  // цикл по столбцам

     {

      printf("a[%d][%d] = ", i, j);

      scanf("%d", (a+i*m+j));

     }

   }

  // Вывод элементов массива

  for(i=0; i<n; i++)  // цикл по строкам

  {

    for(j=0; j<m; j++)  // цикл по столбцам

      {

       printf("%5d ", *(a+i*m+j)); // 5 знакомест под элемент массива

      }

    printf("\n");

  }

  free(a);

  getchar();   getchar(); }

Результат выполнения

Введите количество строк: 3

Введите количество столбцов: 4

a[0][0]=1

a[0][1]=2

a[0][2]=3

a[0][3]=4

a[1][0]=5

a[1][1]=6

a[1][2]=7

a[1][3]=8

a[2][0]=9

a[2][1]=10

a[2][2]=11

a[2][3]=12

1 2 3 4

5 6 7 8

9 10 11 12

Возможен также другой способ динамического выделения памяти под двумерный массив - с использованием массива указателей. Для этого необходимо: - выделить блок оперативной памяти под массив указателей; - выделить блоки оперативной памяти под одномерные массивы, представляющие собой строки искомой матрицы; - записать адреса строк в массив указателей.

Функция malloc() – возвращает указатель на первый байт области памяти размером size, которая была выделена из динамически распределяемой области памяти. Если в динамической области памяти не хватает памяти, то возвращается нулевой указатель.

Пример:

#include <stdio.h> #include <malloc.h> #include <stdlib.h> void main() {

  int **a;  // указатель на указатель на строку

  int i, j, n, m;

  system("chcp 1251");

  system("cls");

  printf("Введите количество строк: ");

  scanf("%d", &n);

  printf("Введите количество столбцов: ");

  scanf("%d", &m);

  // Выделение памяти под указатели на строки

  a = (int**)malloc(n*sizeof(int*));

  // Ввод элементов массива

  for(i=0; i<n; i++)  // цикл по строкам

  {

    // Выделение памяти под хранение строк

    a[i] = (int*)malloc(m*sizeof(int));

    for(j=0; j<m; j++)  // цикл по столбцам

      {

       printf("a[%d][%d] = ", i, j);

       scanf("%d", &a[i][j]);

      }

   }

  // Вывод элементов массива

  for(i=0; i<n; i++)  // цикл по строкам

  {

    for(j=0; j<m; j++)  // цикл по столбцам

      {

        printf("%5d ", a[i][j]); // 5 знакомест под элемент массива

      }

    printf("\n");

    free(a[i]);   // освобождение памяти под строку

  }

  free(a);

  getchar();   getchar(); }

Результат выполнения программы аналогичен предыдущему случаю.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]