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

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

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

ar[0]=1

ar[1]=2

ar[2]=3

ar[3]=4

ar[4]=5

a r

p

В памяти:

int *p=ar;

int *int [];

i nt tmp=ar[i];

равнозначно

tmp=p[i];

tmp=*(p+i);

tmp=*(ar+i);

переместим указатель к следующему элементу массива, но не ar++(ошибка!)

p++; //ar++i

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

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

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

ar[0][0]=1

ar[0][1]=2

ar[0][2]=3

ar[1][0]=4

ar[1][1]=5

ar[1][2]=6

int ar[N][M];

int sum!=0;

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

{

for (int j=0; j<M; j++)

sum+=ar[i][j];

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 }}}

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

char *ar[20];

char *ar[]={ “One”,”Two”,”Three” };

char ar1[][6]={ “One”,”Two”,”Three” };

char ar1[3][6];

Т.к. в запрещённом режиме строковые литералы, расположенные в области памяти, защищены от записи, попытка изменить их вызовет ошибку времени выполнения.

ar1[1][1]= //ar[1][1]=”D”; - ошибка!

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

malloc

calloc

realloc

free

int Mbyte=…;

int *p=static_cast<int*>(malloc(Mbyte));

if (p)…

size_t n=_msize(p)

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

realloc - изменяет размер ранее захваченного блока памяти

p=ststic_cast<int*> realloc(p,2000);

free - освобождается выделенная память

free(p)

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

Преимущество new и delete:

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

  2. результатом выделившейся памяти с помощью malloc является указатель с типом <void *>, в случае использования new: компилятор неявно приводит тип указателя к указанному типу;

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

int *p=new int; //sizeof(int)

malloc(4)

int *p=operator new (sizeof(int));

При динамическом выделении памяти из-за большого количества информации, «накладные» расходы достаточно велики.

delete(p);

Оператор new и массивы.

Создавать массивы следует только тогда, когда:

  1. все или некоторые размерности массива определяются только во время выполнения программы;

  2. размерности массива могут измениться в процессе программы.

Не стоит забывать об удалении (освобождении) динамически занятой памяти.

int n=выражение;

//int ar[n]; // ERROR!!!

int *pn=new int[n]; //выделившийся в памяти блок размером n*sizeof(int)+служебная информация

pn[i]=…;

int *tmp=new int[n*z];

for (int i=0; i<n; i++){tmp[i]=pn[i];}

memcpy(tmp,pn,n*sizeof(int));

delete[]pn;

pn=tmp;

pn[i]=…;

delete[]pn;

delete[]tmp;

pn= Ø;

tmp= Ø;

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