Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19
Download 1.98 Mb.
|
Lekcii AiSD 2015
Связь массивов с указателями
Любое действие, которое достигается индексированием массива, может быть выполнено также с помощью указателей, причём последний вариант будет быстрее. Объявление int a[5]; определяет массив из 5 элементов. Если объект *у объявлен как int *у; тооператор у = &a[0]: присваивает переменной у адрес элемента а f 0 ] . Если перемен- ная у указывает на очередной элемент массива а, то у+ 1 указы- вает на следующий элемент, причём здесь выполняется масшта- 46
у а; Тогда элемент а [ i ) можно представить как * ( а+ i ) . Если у указатель, следующие записи эквивалентны: а[i] *(а+i) у[i] - *(у+i) Таким образом, любой массив (и индексное выражение) можно представить при помощи указателей. a[5] — массив а — имя массива у = &a[0] — адрес начального элемента массива а — адрес начального элемента массива x0 — содержимое начального элемента массива a[0] = x0; a[1] x1; x0 = *у = *а = a[0] xi • +i t — • a+it °[i] В то же время между именем массива и соответствующим указателем есть одно существенное различие. Указатель — это пе- ременная н у = а; или у++; — допустимые операции. Имя массива — это константа. Поэтому конструкции вида а = у: а++; использовать нельзя, т.к. значение константы постоянно и не мо- жет быть изменено. Если указатели адресуют элементы одного массива, то их можно сравнивать (в операциях отношения). В то же время нель- зя сравнивать, либо применять в арифметических операциях ука- затели на разные массивы. Указатели на элементы одного масси- ва можно вычитать, результатом будет число элементов массива, расположенных между уменьшаемым и вычитаемым указателя- 47 Доступ к элементам многомерных массивов также воз- можен с помощью указателей: b[i] [ј][k] *(*(*(b+i)+j)+k) Допускается комбинировать обе формы доступа к элемен- там многомерного массива: b[i] [ј][k] *(b[i] [j]+k) Обращение к элементу массива в языке С++ относится к постфиксному выражению вида PE[IE] Постфиксное выражение PE должно быть указателем на нужный тип, выражение IE должно быть одного из целых типов. Таким образом, если PE — указатель, адресующий массив, то PE[IE] — индексированный элемент этого массива. Выражение *(PE + IE) другой способ доступа к этому же элементу массива. Возможна эквивалентная запись *(IE + PE) т.к. операция сложения коммутативна, и следовательно IE[PE] адресует тот же элемент, что и PE[IE]. int m[] = {1,2,3,4,}; m[0] 1 0[m] 1 Иногда индексы могут иметь отрицательные значения. В этом случае указатель PE должен указывать не на начало масси- Можно определить указатель, инициализированный именем массива, т.е. адресом начального элемента этого массива. int m[] = {1,2,3,4,}; int *mp = m; mp[0] 1, *(mp+3) - 4 Иногда для такого указателя используется термин «указа- тель на жncrus». Следует внимательно относится к употребле- нию этого термина. Его применение для указателя, используе- 48
«Указатель на массив», в отличие от имени массива, являет- ся обычным указателем, неконстантным, со всеми вытекающими последствиями. Операция siz eo f, примененная к такому указа- телю, даёт количество байт, занятых именно указателем, а не адресуемым им массивом. Операция получения адреса & позво- ляет получить адрес указателя, а не адрес начала массива. Нако— нец, значение такого указателя может быть изменено, и он уже не будет адресовать массив. Однако такой указатель, также как и имя массива, может использоваться для доступа к элементам массива с помощью операций [ ] и *, как в рассмотренном примере. Строки как структуры данным могут быть организованы не- сколькими различными способами. Первый способ дескрип- торный. В этом случае строка представляет собой массив симво- лов, первый элемент массива является дескриптором , т.е. содер- жит информацию о длине строки. Непосредственно символы строки хранятся, начиная только со второго элемента массива. Недостатком такого способа организации является ограничен— ная длина строки. Так, если каждый элемент является байтом, то длина строки ограничена 255 символами. Именно такой способ используется в Паскале для строк типа Sm inq. Второй способ организации строк — маркерный. И в этом случае строка также представляется массивом символов, но сим- волы хранятся, начиная с первого (начального) элемента массива, а заканчивается строка специальным символом, который называ- ется маркером. Такой способ используется в Паскале для строк типа ASKIIZ и в Си/Си++. Длина строки при маркерном способе организации, теоретически, неограниченна. Пример маркерного 49 способа организации строк в Си/Си++ уже был приведён: char vls2[] = ”2nd very long string.\n”, Третий способ организации — в виде линейного связного списка. Такой способ будет рассмотрен ниже. В языках Си/Си++ указатели на тип char могут инициали- char *vlsl = “1st very long string.“; Следует отметить, что присваивание для строковых кон— стант (и вообще строк) возможно только при инициализации. По- сле определения символьных массивов или указателей на тип char в программе для назначения им значений следует пользо- ваться библиотечной функцией sL r cpy: char* str; strcpy(str,“c m poкa”) ; Строки при этом обладают всеми свойствами массивов, а указатели — это обычные «указатели на массивы», значением та- кого указателя является адрес начального символа строки. Download 1.98 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling