Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник 357.docx
Скачиваний:
27
Добавлен:
30.04.2022
Размер:
1.75 Mб
Скачать

17.2 Примеры работы с динамическими массивами

Пример 1. Функция для формирования одномерного динамического массива

int * make_mas(int n)

(

int *mas;

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

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

mas[i]=random(10);

return mas;

}

Пример 2. Программа перераспределения памяти.

Эта программа сначала выделяет блок памяти для размещения строки "Пусть всегда будет мир", а затем использует realloc() для увеличения размера блока, чтобы разместить в конце восклицательный знак.

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

int main(void)

{

char *p;

int size;

size= sizeof(“Пусть всегда будет мир”);

p = malloc(size);

if(!p) {

printf("Ошибка при распределении памяти\n");

exit(-1);

}

strcpy(p, "Пусть всегда будет мир");

p = realloc(p, size+1);

if(!p) {

printf("Ошибка при распределении памяти\n");

exit(-1);

}

strcat(p, "!");

printf(p);

free(p);

return 0;

}

Пример 3 Программа, вычисляющая сумму элементов массива

float summa (float* mas, int n); //прототпи функции

Void input_arr_random (float *mas, int n);// прототип функции

float main(float)

{

setlocale(0,"Russian");

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

int n;

printf("введите размерность массива \n");

scanf_s("%d",&n);

mas=(float *)malloc(n*sizeof(float));//выделение памяти

Input_arr_random (mas,n);// вызов функции

printf("\n %f", summa (mas,n));

free(mas); //высвобождение памяти

system("pause");

return 0;}

функция ввода элементов массива

void input_arr_random (float *mas, int n)

{ printf("Массив заполнится числами в заданном диапазоне от -10 до 20: \n");

srand(time(NULL)|clock());

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

mas[i]=-10+rand()%31;

printf("получен массив\n");

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

printf("\n a[%d]= %f", i, mas[i]);

return;

}

функция вычисляющая сумму элементов массива

float summa (float* mas, int n)

{

float s=0;

int i;

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

s+=*(mas+i);

return s;}

17.3 Особенности работы с двумерными динамическими массивами

Недостатком языка Си является невозможность по имени массива определять его размерность и размеры по каждой из размерностей. Это затрудняет передачу массивов в качестве параметров функций.

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

void f (int A[10][10])

{……

}

int main()

{

int B[10][10];

f(B);

}

Проблема заключается в том, что в этом случае нельзя использовать массивы произвольного размера. Чтобы использовать массивы произвольного размера, необходимо использовать указатели.

Так, объявленный одномерный массив int A[n] может быть доступен по указателю на переменную типа int: int * A.

Тогда двумерный массив – это массив, каждый из элементов которого является одномерным массивом, т.е. указателем на какой-то адрес целого числа в памяти. Или двумерный массив – это массив элементов типа int * или же это указатель на переменную типа int *, т. е. это переменная типа int **.

Итак, двойной указатель можно объявить так:

int ** A;

Память под многомерные динамические массивы выделяется по строкам, начиная с первого индекса. Это делается для того, чтобы обеспечить применение операции индексирования ‘[]’ столько раз, какова размерность многомерного массива. В этом случае тип динамического массива объявляется как указатель, который содержит оператор обращения по адресу ‘*’ столько раз, какова размерность массива. Например, указатели на двухмерный и трехмерный целочисленные массивы могут быть объявлены следующим образом:

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