Теоретические положения. Массивы и указатели.
Ранее было введено понятие типов данных в языке С, которые называются иногда базовыми или встроенными. На основе этих типов данных язык С позволяет строить другие типы данных и структуры данных. Массив – одна из наиболее простых и известных структур данных. Под массивом в языке С понимают набор данных одного и того же типа, собранных под одним именем. Каждый элемент массива определяется именем массива и порядковым номером элемента, который называется индексом. Индекс в языке С всегда целое число.
Объявление массива в программе.
Основная форма объявления массива размерности N такова:
тип <имя массива>[размер1] [размер2]…[размерN];
Чаще всего используются одномерные массивы:
тип <имя массива> [размер];
тип – базовый тип элементов массива,
размер – количество элементов одномерного массива.
При описании двумерного массива объявление имеет следующий вид:
тип <имя массива> [размер1][размер2];
В этом описании можно трактовать объявление двумерного массива как объявление массива массивов, т.е. массив размера [размер2], элементами которого являются одномерные массивы <имя массива> [размер1].
Размер массива в языке С может задаваться константой или константным выражением. Нельзя задать массив переменного размера. Для этого существует отдельный механизм, называемый динамическим выделением памяти.
Обсудим более подробно одномерные массивы.
В языке С индекс всегда начинается с нуля. Когда говорится о первом элементе массива, то имеется в виду элемент с индексом 0. Если объявили массив
int a [100];
это значит, что массив содержит 100 элементов от a[0] до [99]. Для одномерного массива легко подсчитать, сколько байт в памяти будет занимать этот массив:
колич. байт =<размер базового типа>*<колич. элементов>.
В языке С под массив выделяется непрерывное место в оперативной памяти.
В языке С не проверяется выход индекса за пределы массива. Если массив a[100] описан как целочисленный массив, имеющий 100 элементов, а в программе указать [200], то сообщение об ошибке не будет выдано, а в качестве значения элемента а[200] будет выдано некоторое число, занимающее соответствующие 2 байта. Можно определить массив любого определенного ранее типа, например
unsigned arr[40], long double[1000], char ch[80].
Массивы символов. Строки.
Однако массивы типа char – символьные массивы – занимают в языке особое место. Во многих языках есть специальный тип данных - строка символов (string). В языке С отдельного типа строки символов нет, а реализована работа со строками путем использования одномерных массивов типа char. В языке С символьная строка – это одномерный массив типа char, заканчивающийся нулевым байтом. Нулевой байт – это байт, каждый бит которого равен нулю. Для нулевого байта определена специальная символьная константа ‘\0’. Это следует учитывать при описании соответствующего массива символов. Так, если строка должна содержать N символов, то в описании массива следует указать N+1 элемент.
Например, описание
char str[11];
предполагает, что строка содержит 10 символов, а последний байт зарезервирован под нулевой байт. Здесь задан обычный одномерный массив, но если нужно трактовать его как строку символов, то это будет строка максимум из 10 элементов.
Хотя в языке С нет специального типа строки, язык допускает строковые константы. Строковая константа – это список литер, заключенных в двойные кавычки. Например,
“Borland C++”, “Это строковая константа”.
В конец строковой константы не надо ставить символ ‘\0’. Это сделает компилятор, и строка “Borland C++” в памяти будет выглядеть так:
|
B |
o |
r |
l |
a |
n |
d |
|
C |
+ |
+ |
\0 |
Есть два простых способа ввести строку с клавиатуры. Первый способ воспользоваться функцией scanf() со спецификатором ввода %s. Надо помнить, что функция scanf( ) вводит символы до первого пробельного символа. Второй способ – воспользоваться специальной библиотечной функцией gets( ), объявленной в файле stdio.h. Функция gets( ) позволяет вводить строки, содержащие пробелы. Ввод оканчивается нажатием клавиши ENTER. Обе функции автоматически ставят конец строки нулевой байт. Не забудьте зарезервировать для него место. В качестве параметра в этих функциях используется просто имя массива.
Вывод строк производится функциями printf() и puts(). Обе функции выводят содержание массива до первого нулевого байта. Функция puts() добавляет в конец выводимой строки символ новой строки. В функции printf() переход на новую строку надо предусматривать в строке формата самим.
Пример. Ввод строки с клавиатуры.
#include<stdio.h>
void main( )
{
char str[80]; /* Зарезервировали место для строки */
printf("Введите строку длиной менее 80 символов:");
gets(str); /* читает строку с клавиатуры, пока не нажмете клавишу Enter */
printf("Вы ввели строку %s \n", str);
printf("Введите еще одну строку длиной менее 80 символов:");
scanf("%s", str); /* читает строку с клавиатуры,
пока не встретится пробел */
printf("Вы ввели строку");
puts(str);
}
