Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мини конспект по С++.doc
Скачиваний:
28
Добавлен:
25.03.2015
Размер:
782.85 Кб
Скачать

Динамическое размещение данных

Если в задаче заранее неизвестно количество объектов и объект описан указателем удобно использовать динамическое размещение данных.

Прототипы функций работы с памятью находятся в библиотеке alloc.h, рассмотрим основные из них:

void *calloc(unsigned n, unsigned m); - возвращает указатель на начало области памяти для размещения n элементов по m байт каждый, при неудачном завершении возвращает значение NULL;

void *malloc(unsigned n); - возвращает указатель на блок памяти длиной n байт, при неудачном завершении возвращает значение NULL;

void *realloc(void *bf, unsigned n); - изменяет размер ранее выделенной памяти с адресом начала bf на n байт;

void free(void *bf); - освобождает ранее выделенный блок памяти с адресом bf;

coreleft(void); - возвращает значение объема неиспользованной памяти (тип возвращаемого результата unsigned – для моделей памяти tiny, small, medium; unsigned long – для других моделей памяти).

Пример выделения памяти для массива действительных чисел размером n:

float *x; // Указатель объекта типа float–x[0]

int n; // Количество элементов массива

. . .

x=(float*)calloc(n,sizeof(float)); // Захват памяти для nэлементов

. . .

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

В С++ введены две операции: захват памяти - new и освобождение захваченной ранее памяти -delete.

Общий формат записи:

указатель =new тип (значение);

. . .

delete указатель;

Например:

int *a;

a=new int (8);

данном случае создана целочисленная динамическая переменная, на которую установлен указатель a и которой присвоено начальное значение 8. После работы с ней освобождаем память:

delete a;

Операции new для массивов:

указатель = newтип [количество] ;

Результат операции – адрес начала области памяти для размещения данных, указанного количества итипа; при нехватке памяти – NULL.

Операция delete для массивов:

delete [ ]указатель;

Пример динамического размещения при работе со строковыми данными в С

Проверить, является ли введенная строка полиндромом (справа-налево читается также как и слева-направо).

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <calloc.h>

void main(void)

{

char *s;

int i, k;

clrscr();

puts(" Vvedi stroky");

gets(s);

k=strlen(s);

s=(char*)calloc(k,sizeof(char)); // Захват памяти для строки длиной k

for (i=0; i<(int)(k/2); i++)

if(s[i]!=s[k-i-1]) { puts("\n NO!!"); getch();

free(s); exit(0); }

puts("\n YES - Polindrom!");

getch();

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

}

Пример динамического размещения одномерного массива в С

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

#include<alloc.h>

void main(void)

{ int i,n; float *a;

puts(“\n Input n:”);

scanf(“%d”,&n);

printf(“\n Свободная память -%d”,coreleft());

a=(float*)calloc(n,sizeof(float)); // Захват памяти

printf(“\n Array a \n”);

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

*(a+i)=(float)random(10); // Диапазон от 0 до 10

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

}

printf(“\n Память после захвата -%d”,coreleft());

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

getch();

}

Пример динамического размещения двумерного массива в С

. . .

void main(void)

{ int i,j,n,m;

float **a;

puts(“\n Input n,m:”);

scanf(“%d %d”,&n,%m);

printf(“\n Свободная память -%d”,coreleft());

a=(float **)calloc(n,sizeof(float*)); // Захват памяти

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

a[i]=(float *)calloc(m,sizeof(float));

. . .

for(i=0; i<n; i++) free(a[i]); // Освобождение памяти

free(a);

getch();

}

Пример создания одномерного динамического массива в С++

...

double *x;

int i, n;

...

cout<< "Введите размер массива: ";

cin>>n;

x = new double [n] ;

if (x == NULL)

{

cout<<" Предел размерности ! ";

return;

}

for (i=0; i<n; i++) //выполняем некоторые действия с массивом

cin>>x[i];

...

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

...

Пример создания двухмерного динамического массива в С++

...

int**m,n1,n2,i,j;

cout<< " Введите размеры массива (количество строк и столбцов): ";

cin>>n1>>n2;

m = new int * [n1]; // Захват памяти для указателей

for ( i=0; i<n1; i++) // Захват памяти для элементов матрицы

m[i] =newint[n2];

. . .

for(i=0;i<n1;i++) // выполняем некоторые действия с матрицей

for ( j=0; j<n2; j++)

m[i][j] = i+j; // *(*(m+i)+j) = i+j;

. . .

for ( i=0;i<n1;i++) // Освобождение памяти

delete [ ] m[i];

delete [ ] m;

. . .

Пример динамического размещения массива строк в С++

#include <iostream.h>

#include <string.h>

void main()

{

char **str;

int n1,i;

cout<<"Введите количество строк: ";

cin>>n1;

str=new char *[n1+1];

for (i=0;i<n1+1;i++)

str[i]=new char[255];

if (str[i]==NULL)

{

cout<<"Predel razmera massiva";

return;

}

cout<<"Введите строки: "<<endl;

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

cin>>*(str+i);

cout<<"Вывод массива строк: "<<endl;

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

cout<<*(str+i)<<endl;

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

delete [ ] str[i];

delete [ ] str;

}