Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
aip-50-60.docx
Скачиваний:
4
Добавлен:
11.09.2019
Размер:
76.6 Кб
Скачать

Доступ к элементам массива.

Обычно при объявлении некоторой переменной резервируется одна или несколько ячеек памяти, и посредством таблицы ссылок с этой ячейкой связывается некоторое имя, которое можно использовать для доступа к ячейкам памяти.

Инициализация массивов и классы памяти.

Для хранения данных, необходимых программе, часто используют массивы. Например, в массиве из 12 элементов можно хранить информацию о количестве дней каждого месяца. В подобных случаях желательно иметь удобный способ инициализации массива перед началом работы программы. Такая возможность, вообще говоря, существует, но только для статической и внешней памяти. Давайте посмотрим, как она используется.

Мы знаем, что скалярные переменные можно инициализировать в описании типа при помощи таких выражений, как, например:

int fix = 1;

floatflax = PI*2;

при этом предполагается, что PI — ранее введенное макроопределение. Можем ли мы делать что-либо подобное с массивом? Ответ не однозначен: и да, и нет.

Внешние и статические массивы можно инициализировать. Автоматические и регистровые массивы инициализировать нельзя.

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

  1. Вычисление размера массива (sizeof()). Выход индекса за пределы массива.

Вычисление размера массива (sizeof()).

Как вы уже знаете, операция sizeof() возвращает физический размер в байтах того объекта, к которому она применяется. Ее можно использовать с объектами любых типов, за исключением битовых полей. Часто операция sizeof() применяется для определения физического размера переменной в тех случаях, когда размер переменных этого типа может меняться от одного компьютера к другому. Вы уже видели, что в зависимости от используемой системы целые числа могут иметь длину 2 или 4 байта. Если у операционной системы запрашивается дополнительная память для размещения семи целых чисел, то необходим способ для определения количества памяти: либо 14 байт (7x2 байта на число), либо 28 байт (7x4 байта на число). В следующей программе этот вопрос решается автоматически (и печатается значение 14 для тех систем, в которых для целого числа отводится 2 байта):

#define iDAYS_OF_WEEK 7

main()

{

int ivideo_library[iDAYS_OF_WEEK]={1,2,3,4,5,6,7};

printf("There are %d number of bytes in the array ivideo_library.\n",(int) sizeof(ivideo_library));

}

Выход индекса за пределы массива.

Вам, наверное, знакомо выражение: "За все нужно платить". Это справедливо и для массивов в С. "Все" — это быстрое выполнение кода программы, а "плата" — отсутствие проверки границ массива. Напомним: поскольку язык С был разработан для замены ассемблера, в целях обеспечения компактности кода, ошибки такого рода компилятор не проверяет. Поскольку компилятор никак не определяет ошибочные ситуации, вы должны быть очень осторожны при работе с граничными значениями индекса массива. Например: компилятор транслирует следующую программу без каких-либо сообщений, однако, при записи в память за границами массива она может изменить значения других переменных или даже вызвать крах программы:

#define iMAX 10

#define iOUT_OF_RANGE 50

main()

{

int inot_enough_room[iMAX], index;

for(index=0; index < iOUT_OF_RANGE; index++)

inot_enough_room[index]=index;

}

  1. Массивы. Ввод и вывод строк.

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