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

Трехмерные массивы

int n=sizeof(ar)/sizeof(int); //всего элементов

n= sizeof(ar)/sizeof(ar [0][0]); //число строк

n= sizeof(ar)/ sizeof(ar [0]); //число столбцов

n = sizeof(ar [0][0])/ sizeof(int); //число элементов в строке

Связь массивов и указателей

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

Имя одномерного массива компилятор интерпретирует как константный указатель на нулевой элемент массива.

1

2

3

4

5

i

ar

nt ar[5]={1,2,3,4,5};

int *p=ar;

int tmp=ar[i];

tmp = p[i];

или

tmp=*(p+1);

tmp=*(ar+i);

p++;

ar++;

Двумерные массивы

Двумерный массив компилятор представляет в виде одномерного массива, каждым элементом которого является строка. Имя двумерного массива компилятор интерпретирует как нулевую строку.

int ar [2][3]={{1,2,3},{4,5,6}};

a

0 строка

r[0][0]=1;

ar[0][1]=2;

ar[0][2]=3;

a

1 строка

r[1][0]=4;

ar[1][1]=5;

ar[1][2]=6;

int b;

ar[1][1]=4;

int *p=ar[0];//+

int *p1=ar; // -

int **p2=ar; //+

int **p3=ar[0][0]//-

b=*(p)//+

b=*(p1)//-

b=*(p2)//-

b=*(p3)//-

int c;

c=**(p);//-

c=**(p2);//+

int d;

d=p[2];

d=p2[1][1];// так делать можно

int ar[2][3]={{1,2,3},{4,5,6}};

sum=0;

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

{

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

{

sum+=ar[i][j];

}

} //сумма элементов массива

sum=0;

int *p=&ar[0][0];

for (int i=0;i<sizeof(ar)/sizeof(int);i++)

{

sum+=*p;

p++;

}

Трехмерные массивы

Имя трехмерного массива компилятор интерпретирует как константный указатель на нулевой слой

int ar[2][3][4]={{{1,2,3.4},{5,6,7,8},{9,10,11,12}},{{-1,-2,-3,-4},{-5,-6,-7,-8},{-9,-10,-11,-12}}};

ar[0][0][0] = 1;

ar[0][0][1] = 2;

ar[0][2][3] = 12;

ar[1][0][0] = -1;

ar[1][2][3] = -12;

Сумма элементов:

int sum=0;

int *p=&ar[0][0][0];

for(int i=0; i<sizeof (ar)/sizeof(int);i++)

{

sum+=*p;

p++;

}

Массивы указателей

Элементами массива могут быть любые данные, в том числе и указатели

а) char *ar[20];//объявлен одномерный массив из указателей

char *ar[20]={0};

б) инициализация массива указателей строковыми литералами

char *ar[]={«one», «two», «three»};

Замечание. Существуют принципиальные различия

1) в расположении памяти массива указателей и, на первый взгляд, подобному ему двумерного массива

char ar1[][6]= {«one», «two», «three»};

2) в использовании массивов, где

char ar1[][6];

Динамическое распределение памяти

Для работы с динамической памятью используется стандартная библиотека <stdlib>.

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

  1. malloc – выделяет указанное в качестве параметра количество байт в heap (область памяти, куча). Если память выделить не удалось, то возвращается нулевой указатель. Тип возвращаемого указателя void*.

calloc – обнуляет содержимое данной памяти

int size = 24000м0000;

int *p = static_cast <int*>(malloc(size));// преобразование в указатель типа int

int *pp=(int*)(malloc(size)); // используется не во всех операционных системах

для проверки выделения памяти:

if (!p) return;

  1. для получения размера выделенного блока памяти используется функция _msize

size_t n=_msize(p);

  1. для изменения размера выделенной памяти используется функция realloc

p=static_cast<int*>(realloc(p,100));

if (!p)

  1. функция free освобождает память.

Управление памятью: операторы new и delete

При динамическом программировании рекомендуется использовать операторы new и delete. Особенности использования new:

  1. не обязательно указывать число выделяемых байт

  2. не требуется явно приводить тип возвращаемого значения

  3. оператор new совмещает выделение памяти с вызовом инициализирующей функции

int *p=new int; //выделяется 4 байта

delete (p);

p=0;