|
Программирование >> Процедурные приложения
Размер массива можно задать либо в квадратных скобках, либо указывая список начальных значений при инициализации массива. В большинстве компиляторов разрешены оба метода. Для примера рассмотрим создание часто используемых во многих программах сообщений об ошибках. Задать соответствующий массив символов можно двумя способами. Вот первый из них: char sz!nput Errdr[41] = Введите значения от 0 до 9.\n ; char szDevice Error[18] = Диск недоступен.\n ; char szMonitor Error[49] = Для работы программы необходим цветной монитор. \n ; char szWarning[36]= Эта операция приведет к удалению файла!\n ; Здесь необходимо предварительно подсчитать число символов в строке, не забыв к полученному числу прибавить 1 для символа \0,обозначающего конец строки. Это нудная работа, к тому же чреватая ошибками. Можно позволить компилятору автоматически вычислить размер массива, как показано ниже: char szInput Error[] = Введите значения от 0 до 9.\n ; char szDevice Error[] = Диск недоступен.\n ; char szMonitor Error[] = Для работы программы необходим цветной монитор.\п ; char szWarning[] = Эта операция приведет к удалению файла!\n ; В процессе инициализации массива, для которого не задан размер, компилятор автоматически создаст массив такого размера, чтобы вместить все указанные элементы. Доступ к элементам массива При объявлении переменной происходит резервирование одной или нескольких ячеек памяти, а в специальную таблицу лексем программы заносится имя переменной и адрес связанных с ней ячеек. Например, в следующей строке программы резервируется ячейка памяти для хранения целочисленного значения переменной с именем iweekend. int iweekend; В случае показанного ниже массива iweek происходит резервирование не одной, а семи ячеек памяти, каждая из которых хранит одно целочисленное значение. int iweek[7] ; Рассмотрим, как организуется доступ к одиночной ячейке памяти, связанной с переменной iweekend, и к семи ячейкам памяти, связанным с массивом iweek. Чтобы получить значение, хранящееся в переменной iweekend, достаточно обратиться к этой переменной по имени. При доступе к массиву следует дополнительно указать индекс, представляющий собой порядковый номер элемента массива, к которому вы хотите обратиться. В следующем примере последовательно выполняется обращение ко всем элемента созданного массива: iweek[0]; iweek[1]; iweek[2]; iweek[3]; iweek[6]; При обращении к элементу массива в квадратных скобках указывается целочисленный индекс, представляющий собой смещение адреса по отношению к базовому адресу первого элемента. Начинающие программисты часто допускают ошибку, считая, что первый элемент имеет индекс 1. Для обращения к первому элементу массива следует указывать индекс 0, так как смещение первого элемента относительно самого себя, естественно, является нулевым. А например, к третьему элементу следует обращаться по индексу 2, так как он на две ячейки смещен по отношению к первому элементу. При работе с массивами квадратные скобки используются в двух разных случаях. Когда происходит объявление массива, число в квадратных скобках указывает количество резервируемых ячеек памяти: int iweek[7]; Если же необходимо получить доступ к определенному элементу массива, вслед за именем массива в квадратных скобках указывается индекс элемента: iweek[3]; Для описанного выше массива iweek следующее выражение присваивания является неправильным: iweek[7] = 53219; В массиве iweek нет элемента со смещением 7 по отношению к первому элементу, другими словами - восьмого элемента. Поскольку массив содержит только семь элементов, данная строка вызовет ошибку. Вы как программист ответственны за то, чтобы индексы в обращениях к массиву имели допустимое значение. Рассмотрим следующие объявления массива, переменных и константы: #define iDAYS OF WEEK 7 int iweek[iDAYS OF WEEK]; int iweekend = 1; int iweekday = 2; и выражения: iweek[2]; iweek[iweekday] ; iweek[iweekend + iweekday]; iweek[iweekday - iweekend]; iweek[iweekend - iweekday]; Первые две строки содержат обращение к третьему элементу массива. В первом случае индекс задается числовой константой, а во втором случае для этих целей используется имя переменной. Последующие три строки демонстрируют применение выражений для установки индексов. Важно только, чтобы результатом выражения было логически корректное число. Например, в третьей строке получаем индекс 3, который указывает на четвертый элемент массива. В четвертой строке индекс равен 1 и указывает на второй элемент массива, а вот последняя строка ошибочна, так как значение индекса -1 недопустимо. Для того чтобы получить доступ к элементу массива, нет необходимости учитывать размер занимаемой им памяти, так как подобная работа выполняется компилятором автоматически. Предположим, например, что вам нужно получить значение третьего элемента массива iweek, содержащего целые числа. Как было сказано в главе Работа с данными , в различных системах для представления данных типа int могут использоваться ячейки памяти разных размеров: иногда 2 байта, иногда 4. Но независимо от системы вы в любом случае сможете получить доступ к третьему элементу массива, используя выражение iweek[ 2 ]. Индекс указывает на порядковый номер элемента в массиве вне зависимости от того, сколько байтов занимает каждый элемент. Вычисление размера массива в байтах Вам уже известен оператор sizeof, возвращающий размер указанного операнда в байтах. Этот оператор можно использовать с переменными любых типов, за исключением битовых полей. Часто оператор sizeof применяют, чтобы определить размер переменной, тип которой в разных системах может иметь разную размерность. Как говорилось выше, в одном случае для представления целочисленного значения отводится 2 байта, в другом - 4 байта. Поэтому, например, при работе с массивами, размещаемыми в памяти динамически, необходимо точно знать, сколько памяти запрашивать у операционной системы. Следующая программа автоматически вычислит и отобразит на экране число байтов, занимаемых массивом из семи целочисленных элементов: * sizeof.с * Эта программа на языке С демонстрирует использование * оператора sizeofдля определения физического размера массива. #include <stdio.h> #define iDAY OF WEEK 7 main () { int iweek[iDAY OF WEEK] = (1,2, 3, 4, 5, 6, 7} ; printf( Массив iweek занимает%d байт.\n ,(int) sizeof(iweek)); return(0);. Вы можете спросить, почему значение, возвращаемое оператором sizeof, приводится к типу int. Дело в том, что в соответствии со стандартом ANSI данный оператор возвращает значение типа size t, поскольку в некоторых системах одного лишь типа int оказывается недостаточно для представления размерностей данных некоторых типов. В нашем примере операция приведения необходима также для того, чтобы выводимое число соответствовало спецификации %d функции printf(). С помощью следующей программы можно проследить, как размещаются в памяти элементы массива iarray. * array. с * Этa программа на языке С позволяет убедиться * в смежном размещении в памяти элементов массива. #include <stdio.h> #define iDAYS 7 main () int index, iarray[iDAYS]; printf( sizeof(int)= %d\n\n ,(int)sizeof(int)); for(index = 0; index < iDAYS; index++) printf( siarray[%d]= %X\n ,index, &iarray[index]); return(0); } Запустив программу, вы получите примерно следующий результат: sizeof(int)= 4
Обратите внимание на то, что оператор взятия адреса & можно применять к любым переменным, в том числе к элементам массива. Над элементом массива можно выполнять те же операции, что и над любой другой переменной, использовать его в выражениях, присваивать значения и передавать в качестве аргумента функциям. В рассматриваемом примере по отображаемым адресам можно убедиться, что на каждый элемент действительно отводится 4 байта памяти. Ниже показан аналог этой же программы на языке C++: array. срр Это версия предыдущей программы на языке C++. #include <iostream.h> #define iDAYS 7 main () { int index, iarray[iDAYS]; cout << sizeof (int) = << (int)sizeof(int) << \n\n ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |