Массивы. Их связь с указателями.

 

Массивы – это один из примеров структурированного типа данных.

Массив – это расположенные вплотную друг за другом в памяти элементы одного и того же типа. Каждый массив имеет имя. Доступ к отдельным элементам массива осуществляется по имени массива и индексу (порядковому номеру) элемента.

Основные свойства массива:

все элементы массива имеют один и тот же тип;

все элементы массива расположены в памяти друг за другом; индекс первого равен 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; просмотров: 958;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.013 сек.