|
Программирование >> Процедурные приложения
int imatrix[4][3]={ {1},{2},{3},(4} }; main () { int irow index, icolumn index; char clocal cube[2] [3][4]; cout<< Размер массива clocal cube = << sizeof(clocal cube) << \n ; cout << Размер таблицы clocal cube[0] = << sizeof (clocal cube[0]) << \n ; cout<< Размер строки clocal cube[0][0] = << sizeof(clocal eube[0][0]) << \n ; cout << Размер элемента clocal cube[0][0][0] = << sizeof(clocal cube[0][0][0]) << \n ; vdisplay results(clocal cube); cout << Элемент cglobal cube[0][1][2] = << cglobal cube[0][1][2] << \n ; cout << Элемент cglobal cube [1][0][2]= << cglobal cube[l][0][2] << \n ; cout << \пВывод фрагмента массива cglobal cube (таблица 0)\n ; for (irow index = .0; . irow index < 4; irow index++) ( for(icolumn index = 0; icolumn index < 5; icolumn index++) cout << cglobal cube[0][irow index][icolumn index]; cout << \n ; } cout << \пВывод фрагмента массива cglobal cube (таблица 4)\n ; for(irow index = 0; irow index < 4; irow index++) { for(icolumn index = 0; icolumn index < 5; icolumn index++) cout << cglobal cube[4][irow index][icolumn index]; cout << \n ; ) cout << \пВывод всего массива imatrix\n ; for (irow index = 0; irow index .< 4; irow index++) { for(icolumn index =0;icolumn index < 3; icolumn index++) cout << imatrix[irow index][icoluran index]; cout << \n ; } return(0); } void vdisplay results(char carray[][3][4]) cout << Размер массива carray = << sizeof(carray) << \n ; cout << Размер таблицы carray[0] = << sizeof(carray[0]) << \n ; cout << Размер массива cglobal cube = << sizeof(cglobal cube) << \n ; cout << Размер таблицы cglobal cube[0]= << sizeof(cglobal cube[0]) << \n ; Прежде всего обратите внимание на то, как объявляется и инициализируется массив cglobal cube. Фигурные скобки используются для выделения групп символов, относящихся к одной размерности массива. Такой подход облегчает работу по заполнению массива данными, так как позволяет четко визуализировать его форму. А в принципе, в фигурных скобках нет необходимости: все элементы можно записать и в один ряд. Разбиение списка элементов на блоки особенно полезно в тех случаях, когда отдельные элементы следует оставить незаполненными. В нашем случае для большей наглядности трехмерный массив лучше всего сгруппировать в пять блоков, каждый из которых представляет собой таблицу из четырех строк и пяти столбцов. В процессе выполнения программы на экран будут сначала выведены четыре строки с описанием размера всего массива clocal cube, одной его таблицы, строки и отдельного элемента. Эти значения помогут вам лучше представить, из чего складывается размер массива. К примеру, размер трехмерного массива можно вычислить как произведение размеров трех его составляющих, умноженное на размер одного элемента. В нашем случае размер массива clocal cubeбудет равен 2*3*4*sizeof(char) = 24. Обратите внимание на то, что часть массива clocal cube[0]сама является двухмерным массивом 3x4, то есть ее размер составляет 12. Размер строки clocal cube[0][0]равен 4, что соответствует числу элементов в ней, так как размер одного элемента равен 1 (sizeof(clocal cube[0] [0][0])). Чтобы полностью разобраться с многомерными массивами, следует четко уяснить, что выражение clocal cube[ 0 ] является константным указателем. В программе не объявлен массив clocal cube[ 0 ] - на самом деле это последнее измерение многомерного массива clocal cube. Выражение clocal cube[0 ] не ссылается ни на один конкретный элемент массива, а лишь указывает на обособленный его фрагмент, поэтому тип данного выражения не char, а константный указатель на char, который не может выступать адресным операндом, то есть стоять слева от оператора присваивания. Интересные события происходят, когда имя массива clocal cubeпередается в качестве аргумента функции vdisplay results(). В теле функции оператор sizeof не сможет правильно определить размер параметра carray, так как функция получает только копию адреса первого элемента массива, поэтому оператор вернет размер этого адреса (4 байта), а не самого массива и даже не его первого элемента. В то же время, размер фрагмента саггау[0]будет вычислен правильно - 3x4=12, поскольку в заголовке функции указано, что первый параметр является массивом, две последние размерности которого равны 3 и 4. Функция vdisplay results() выводит также размер глобального массива cglobal cube, причем вычисляет его правильно. На этом примере мы видим, что из тела функции можно получать непосредственный доступ к глобальному массиву, но если массив передается в качестве аргумента, то функции доступен только его адрес. Две строки в теле программы, следующие за вызовом функции vdisplay results() , демонстрируют возможность обращения к отдельным элементам многомерного массива cglobal cube. Выражение cglobal cube[0] [1] [2] возвращает значение элемента нулевой (первой по порядку) таблицы, второй строки и третьего столбца - R. Выражение cglobal cube[l] [0][2]ссылается на элемент второй по порядку таблицы, первой ее строки и третьего столбца - В. Следующий фрагмент программы представлен тремя парами из двух вложенных циклов for, которые демонстрируют последовательный доступ к элементам трехмерного массива. Первая пара циклов for выводит на экран строки нулевой (первой по порядку) таблицы массива cglobal cube, причем во внешнем цикле выбирается строка, а во внутреннем цикле последовательно выводятся все элементы этой строки. С помощью второй пары циклов for выводится содержимое пятой таблицы массива cglobal cube. В конце отображается содержимое массива imatrix в виде таблицы; именно так большинство из нас и представляет себе двухмерный массив. Информация, выводимая программой, будет выглядеть следующим образом: Размер массива clocal cube = 24 Размер таблицы clocal cube[0] = 12 Размер строки clocal cube[0][0] = 4 Размер элемента clocal cube[0][0][0]= 1 Размер массива саггау = 4 Размер таблицы саггау[0] = 12 Размер массива cglobal cube = 100 Размер таблицы cglobal cube[0] = 20 Элемент cglobal cube[0][1][2] = R Элементcglobal cube[1][0][2] = В Вывод фрагмента массива cglobal cube (таблица 0) TABLE ZERO ROW 3 Вывод фрагмента массива cglobal cube(таблица 4) TABLE FOUR row 2 abed Вывод всего массива imatrix 100 200 300 400 Вас удивила последняя часть? Тогда рассмотрим инициализацию массива imatrix. Каждая внутренняя пара фигурных скобок соответствует новой строке массива, но, поскольку внутри скобок указано меньше значений, чем размер строки, отсутствующие элементы массива остаются нулевыми. Вспомните, что в C/C++ все неинициализированные элементы статического массива по умолчанию автоматически становятся равными нулю. Функции работы со строками и массивы символов Многие функции работы со строками принимают в качестве аргумента имя массива символов: gets(),putsO, fgetsO,fputsO, sprintfO, strcpyO, strcat(), strncmp() и strlen(). Настало время познакомиться с ними. Сейчас вам будет значительно проще понять принципы их работы, поскольку вы уже изучили основные концепции создания массивов. Функцииде!з( ), puts( ), fgets( ), fputs( ) изрг1п!Г( ) В следующей программе показано, как с помощью функций gets(), puts (), fgets(), fputs() и sprintf() можно управлять процессом ввода/вывода строк: * stringio.c * Эта программа на языке С демонстрирует применение функций работы со строками. #include <stdio.h> #define iSIZE 20 main()
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |