Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19


Download 1.98 Mb.
bet14/53
Sana15.08.2023
Hajmi1.98 Mb.
#1667321
TuriУчебное пособие
1   ...   10   11   12   13   14   15   16   17   ...   53
Bog'liq
Lekcii AiSD 2015

3.1 Массивы

Как было отмечено выше, арифметические операции, вы- полняемые над указателем и целым значением, имеют осмыслен- ный результат, если указатель адресует непрерывный блок памя- ти, хранящий множество элементов одного типа. Именно этот блок и называется массивов. Одномерные массивы часто назы- ваются векторами.


Массив объявляется указанием числа элементов массива, которое должно быть положительным целым константны м выражением, заключённым в квадратные скобки.
float echo[10];



нуля.
Индексация элементов массива в языке С++ начинается с


Массивы в принципе являются статическими структурами



данных, т.е. не могут изменять изначально заданный размер. В то же время в языках Си/Си++ могут существовать переменные лю- бых типов и массивы, отдельно специфицированные как стати- ческие (т.е. имеющие статический класс памяти).
static int mas1[20];

Это означает, во-первых, что такие переменные и массивы суще- ствуют в программе от точки создания до конца работы програм- мы и, во-вторых, гарантируется, что такие переменные и массивы инициализируются нулями или эквивалентными значениями.


В разных языках программирования информация о размере массива может храниться в самом массиве (дескрипторный спо- соб в языке Паскаль), либо размещаться в системных переменных и быть недоступной для программиста (обычные массивы с Си/Си++). В последнем случае при работе с массивом требуется явно указывать его размер.
Массивы могут быть инициализированы набором значений, заключённых в фигурные скобки. Если при инициализации число значений меньше заданного числа элементов, то оставшиеся эле- менты инициализируются нулями или эквивалентными значе-

41





int a[5] = {7, 6, 9}; // a[3]=a[4]=0

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


int а[] = {7, 6, 9, 3, 4};
Массив символов может быть инициализирован строковой константой.
char vls2[] = "2nd very long string.\n",



    1. Дннамнческие массивы

Как выше уже отмечалось, массивы по своей организации в принципе являются статическими структурами данных, их размер сохраняется неизменным в течение всей работы программы или от момента создания до момента уничтожения. Термин «динами- ческие» в данном случае относится к способу создания массивов. Такие массивы определяются при помощи указателей, а для их создания и удаления используются специальные процедуры, функции или операции динамического выделения и освобожде- ния памяти. Такие операции могут использоваться для работы не только с динамическими массивами, но и с другими динамиче- скими программными объектами, например, отдельными пере- менными.


int *р; //Указатель
р = пек in L i / / Динамическая переменная знакового целого типа
float *b2 = new float (20.5): // flннЦз И3dЦNЯ
динамической переменной
int *p2;
p2 = пек in L [ 5 ] ; / / Динамический массив целых
чисел из 5 элементов

Динамический массив отличается от обычного (автоматиче- ского, статического) еще и тем, что размер его может задаваться не только константой, но и переменной. При этом во время рабо-


42
ты программы массив может уничтожаться, память, им занимае— мая, будет освобождена, а затем указатель, при необходимости, может быть ещё раз использован для организации массива. Имя такого массива останется тем же самым, но, фактически, это бу- дет совершенно другой массив, возможно, другого размера и pac- положенный в другой области памяти.


de 1eбe р i / / Удаление динамической переменной
delete b2;
delebe [ ) p2 ; / / Удаление динамического массива (освобождение памяти)

При удалении динамического массива указание квадрат- ные скоdок обязательно (они могут быть пустыми в большинстве случаев). Иначе будет освобождена память, занимаемая только начальным элементом этого массива, а остальная память останет- ся занятой и к ней не будет доступа («утечка памяти» ). Если указатель, используемый в операции de 1eбe, адресует не начало блока, выделенного операцией пек, то последствия операции de 1ete могут быть непредсказуемы. Если указатель содержит значение NULL, то de 1ete не выполняет никаких действий.


int size = 40;
p2 = пек int siz e ] i / / Пересоздание нового масси— ва с тем же именем

Динамический массив в языке Си++ имеет дескриптор, не- доступный для программиста, но необходимый для правильной работы операции освобождения памяти. Именно поэтому квад- ратные скобки при удалении массива могут указываться nycmы -


Динамические массивы, в отличие от обычных, не могут


быть инициализированы.




    1. Download 1.98 Mb.

      Do'stlaringiz bilan baham:
1   ...   10   11   12   13   14   15   16   17   ...   53




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling