|
Программирование >> Инициализация объектов класса, структура
int main() { const int array size = 10; int ia[ array size ]; for ( int ix = 1; ix <= array size; ++ix ) ia[ ia ] = ix; ... значением индекса. Найдите допущенные ошибки: const int array size = 7; int ia1[] = { 0, 1, 2, 3, 4, 5, 6 }; int main() { int ia3[ array size ]; for ( int ix = 0; ix < array size; ++ix ) ia2[ ix ] = ia1[ ix ]; return 0; В качестве индекса массива может выступать любое выражение, дающее результат целого int someVal, get index(); типа. Например: ia2[ get index() ] = someVal; Подчеркнем, что язык С++ не обеспечивает контроля индексов массива - ни на этапе компиляции, ни на этапе выполнения. Программист сам должен следить за тем, чтобы индекс не вышел за границы массива. Ошибки при работе с индексом достаточно распространены. К сожалению, не так уж трудно встретить примеры программ, которые компилируются и даже работают, но тем не менее содержат фатальные ошибки, рано или поздно приводящие к краху. Упражнение 3.22 (a) int ia[ buf size ]; (d) int ia[ 2 * 7 - 14 ] (b) int ia[ get size() ]; (e) char st[ 11 ] = fundamental ; Какие из приведенных определений массивов содержат ошибки? Поясните. i (c) int ia[ 4 * 7 - 14 ]; Упражнение 3.23 Следующий фрагмент кода должен инициализировать каждый элемент массива int ia[ 4 ][ 3 ] = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 9, 10, 11 } массивы тоже могут быть инициализированы: }; Внутренние фигурные скобки, разбивающие список значений на строки, необязательны и используются, как правило, для удобства чтения кода. Приведенная ниже инициализация в точности соответствует предыдущему примеру, хотя менее понятна: int ia[4][3] = { 0,1,2,3,4,5,6,7,8,9,10,11 }; Следующее определение инициализирует только первые элементы каждой строки. Оставшиеся элементы будут равны нулю: int ia[ 4 ][ 3 ] = { {0}, {3}, {6}, {9} }; Если же опустить внутренние фигурные скобки, результат окажется совершенно иным. Все три элемента первой строки и первый элемент второй получат указанное значение, а остальные будут неявно инициализированы 0. int ia[ 4 ][ 3 ] = { 0, 3, 6, 9 }; При обращении к элементам многомерного массива необходимо использовать индексы для каждого измерения (они заключаются в квадратные скобки). Так выглядит int main() { const int rowSize = 4; const int colSize = 3; int ia[ rowSize ][ colSize ]; for ( int = 0; i < rowSize; ++i ) for ( int j = 0; j < colSize; ++j ) ia[ i ][ j ] = i + j j; инициализация двумерного массива с помощью вложенных циклов: 3.9.1. Многомерные массивы В С++ есть возможность использовать многомерные массивы, при объявлении которых необходимо указать правую границу каждого измерения в отдельных квадратных скобках. Вот определение двумерного массива: int ia[ 4 ][ 3 ]; Первая величина (4) задает количество строк, вторая (3) - количество столбцов. Объект ia определен как массив из четырех строк по три элемента в каждой. Многомерные первого элемента: &ia[0] оба важения возвращают перв элемент *ia; Аналогично обратиться к значению первого элемента массива можно двумя способами: ia[0]; Чтобы взять адрес второго элемента массива, мы должны написать: &ia[1]; Как мы уже упоминали раньше, выражение ia+1; также дает адрес второго элемента массива. Соответственно, его значение дают нам *(ia+1); следующие два способа: ia[1]; Конструкция ia[ 1, 2 ] является допустимой с точки зрения синтаксиса С++, однако означает совсем не то, чего ждет неопытный программист. Это отнюдь не объявление двумерного массива 1 на 2. Агрегат в квадратных скобках - это список выражений через запятую, результатом которого будет последнее значение 2 (см. оператор занятая в разделе 4.2). Поэтому объявление ia[1,2] эквивалентно ia[2]. Это еще одна возможность допустить ошибку. 3.9.2. Взаимосвязь массивов и указателей Если мы имеем определение массива: int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 }; то что означает простое указание его имени в программе? Использование идентификатора массива в программе эквивалентно указанию адреса его
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |