Массивы. Их связь с указателями.
Массивы – это один из примеров структурированного типа данных.
Массив – это расположенные вплотную друг за другом в памяти элементы одного и того же типа. Каждый массив имеет имя. Доступ к отдельным элементам массива осуществляется по имени массива и индексу (порядковому номеру) элемента.
Основные свойства массива:
все элементы массива имеют один и тот же тип;
все элементы массива расположены в памяти друг за другом; индекс первого равен 0;
имя массива является указателем-константой, равной адресу начала массива (первого байта первого элемента массива).
Признаком массива при описании является наличие парных скобок [ ]. Константа или константное выражение в квадратных скобках задает число элементов массива. Например:
char buffer[81]; int Key[4];
При описании массива может быть выполнена инициализация его элементов.
Существует два метода инициализации массивов:
1) инициализация по умолчанию; она применяется только к статическим и внешним массивам (о классах хранения и внешних переменных см. в 8.2 и 8.4); по умолчанию все элементы внешних и статических массивов инициализируются компилятором нулями;
2) явная инициализация элементов; после описания массива помещается список начальных значений элементов массива, заключенный в фигурные скобки. Существуют две формы явной инициализации элементов массива:
а) явное указание числа элементов массива и список начальных значений, возможно с меньшим числом элементов.
Например:
char array[10] = { ‘A’, ‘B’, ‘C’, ‘D’ };
Здесь описывается массив из 10 элементов. Первые 4 элемента массива инициализируются символами ‘A’, ‘B’, ‘C’, ‘D’. Значения остальных 6 элементов либо равно 0, если массив внешний или статический, либо не определено. Если список начальных значений содержит больше элементов, чем число в квадратных скобках, Borland C++ генерирует сообщение об ошибке;
б) только со списком начальных значений. Компилятор определяет число элементов массива по списку инициализации. Например:
char array[] = { ‘A’, ‘B’, ‘C’, ‘D’ };
В результате создается массив ровно из 4 элементов, и эти элементы получают начальные значения из списка инициализации.
Если при описании массива отсутствуют значение в квадратных скобках и список начальных значений, компилятор обычно регистрирует ошибку. Однако в тех контекстах, где не требуется резервирование места в памяти, этого не происходит:
если массив объявляется как внешний при условии, что в том месте, где массив описывается, приведена информация о числе его элементов. Например:
extern char array[];
в описании функции, если указатель на первый элемент массива является аргументом функции. Например:
int function (int input_array[], int index)
{ /* тело функции */ }
в прототипах функций, использующих в качестве аргумента указатель на первый элемент массива.
Доступ к отдельным элементам массива может выполняться либо с помощью индекса, либо операцией *. В первом случае для ссылки на нужный элемент указывается его порядковый номер в массиве, заключенный в квадратные скобки. Самый первый элемент массива имеет порядковый номер 0. Пример:
int a[] = { 1, 2, 3, 4, 5 };
int index = 0, first, last, bad;
first = a[index]; /* first = 1 */
last = a[4]; /* last = 5 */
bad = a[index + 6]; /* bad случайно */
В языке Си для повышения производительности программы не выполняются многие проверки корректности вычислений, в том числе и контроль доступности значений индекса массива. Поэтому в приведенном примере значение bad - это содержимое двух байтов памяти сразу после описанного массива а. Содержимое этих байтов случайно.
Другой способ доступа к элементам массива - использование механизма указателей. Так как имя массива - это указатель-константа на первый байт первого элемента массива, то, используя операцию *, можно выполнить доступ к любому из элементов массива. Будут полностью эквивалентными ссылки на i-й элемент массива array (независимо от типа элемента) array[i] и *(array + i), причем оба способа для Borland C++ дают практически одинаковый по производительности код. Следующие выражения являются тождествами:
array == &array[0],
(array + i) == &array[i].
ОПЕРАТОРЫ
Общие сведения
Операторы управления вычислительным процессом позволяют выполнять ветвление, циклическое повторение одного или нескольких операторов, передачу управления в нужное место кода программы. Под вычислительным процессом понимают процесс выполнения операторов программы. Операторы программы могут быть простыми или составными. Простой оператор - это оператор, не содержащий другие операторы. Разделителем простых операторов служит точка с запятой. Специальным случаем простого оператора является пустой оператор, состоящий из единственного символа ‘;’. Составной оператор, или блок,- это любая совокупность простых операторов, заключенная в фигурные скобки {}. Составной оператор идентичен простому оператору и может находиться в любом месте программы, где синтаксис языка допускает наличие оператора, но дополнительно влияет на так называемую видимость переменных.
Оператор if
Операторы ветвления выбирают в программе из группы альтернатив возможное продолжение вычислительного процесса. Выбор выполняется исходя из значения заданного выражения. В С++ используются два оператора ветвления: if...else и switch.
Оператор if имеет следующую общую форму записи:
if (cond_expression) TRUE_statement
[else FALSE_statement]
При выполнении оператора if сначала вычисляется логическое выражение cond_expression. Если результат - ИСТИНА (любое отличное от нуля значение), выполняется оператор TRUE_statement. Если результат логического выражения – ЛОЖЬ (равен 0), то выполняется оператор FALSE_statement. Если ключевое слово else отсутствует, то в этом случае оператор TRUE_statement пропускается, а управление передается на следующий после if оператор.
Операторы TRUE_statement и FALSE_statement сами могут быть операторами if, образуя так называемые вложенные if. Компилятор интерпретирует вложенные if, сопоставляя каждое из ключевых слов else с последним встретившимся словом if, не имеющим " своего" else. Соответствие ищется в пределах блока, в который заключено слово if. Внутренние и внешние блоки при этом не рассматриваются. Если соответствия для if не найдено, компилятор полагает, что if не имеет ветви else. Например,
int a, b; то же самое, но int a, b;
if(b>0) в первом операторе if(b>О)
а=1; if отсутствует else а=1;
else if(b==0)
if(b==0) a=0;
а=0; else
else a=-1;
а=-1;
В результате переменной а будет присваиваться значение -1, если b<0, +1, если b>0, и 0, если b=0. Но ошибочной будет следующая последовательность операторов:
int x=1, у=1;
if(x==1)
if(y==1) puts("х равно 1 и y равно 1);
else
puts("х не равно 1");
Строка" х не равно 1" будет выводиться тогда, когда значение х на самом деле равно 1. Ошибка происходит из-за того, что компилятор сопоставляет if с ближайшим else так, как это показано тонкой сплошной чертой. Ошибка может быть исправлена, если использовать фигурные скобки, ограничивающие блок:
int x=1, у=1;
if(x==1)
{
if(y==1) puts("х равно 1 и y равно 1);
}
else
puts("х не равно 1");
Операция условия ?: является частным случаем оператора if...else. Например, фрагмент
if(cond_expression)
x=y;
else x=y+4;
эквивалентен более короткой записи:
х=(cond_expression)? y:y+4;
Дата добавления: 2017-01-29; просмотров: 1044;