
- •Оператор goto.
- •Использование goto.
- •Оператор exit().
- •Оператор atexit().
- •Массивы.
- •Понятие массив.
- •Массивы в с.
- •Объявление массивов.
- •Проблема ввода.
- •Инициализация массивов.
- •Инициализация по умолчанию.
- •Инициализация безразмерных массивов.
- •Доступ к элементам массива.
- •Инициализация массивов и классы памяти.
- •Вычисление размера массива (sizeof()).
- •Выход индекса за пределы массива.
- •Ввод и вывод строк.
- •Многомерные массивы.
- •Инициализация двумерного массива.
- •Массивы в качестве аргументов функций.
- •Передача массивов функциям с.
- •Строковые функции и символьные массивы.
- •Функции gets(), puts(), fgets(), fputs() и sprintf().
- •Определение переменных-указателей.
- •Объявление переменных-указателей.
- •Простые операторы с указателями.
- •Инициализация указателей.
Доступ к элементам массива.
Обычно при объявлении некоторой переменной резервируется одна или несколько ячеек памяти, и посредством таблицы ссылок с этой ячейкой связывается некоторое имя, которое можно использовать для доступа к ячейкам памяти.
Инициализация массивов и классы памяти.
Для хранения данных, необходимых программе, часто используют массивы. Например, в массиве из 12 элементов можно хранить информацию о количестве дней каждого месяца. В подобных случаях желательно иметь удобный способ инициализации массива перед началом работы программы. Такая возможность, вообще говоря, существует, но только для статической и внешней памяти. Давайте посмотрим, как она используется.
Мы знаем, что скалярные переменные можно инициализировать в описании типа при помощи таких выражений, как, например:
int fix = 1;
floatflax = PI*2;
при этом предполагается, что PI — ранее введенное макроопределение. Можем ли мы делать что-либо подобное с массивом? Ответ не однозначен: и да, и нет.
Внешние и статические массивы можно инициализировать. Автоматические и регистровые массивы инициализировать нельзя.
Если ничего не засылать в массив перед началом работы с ним, то внешние и статические массивы инициализируются нулем, а автоматические и статические массивы содержат какой-то «мусор», оставшийся в этой части памяти.
Вычисление размера массива (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;
}
Массивы. Ввод и вывод строк.