Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Массивы (Объявление массивов, Передача массивов в функции, Сортировка массивов, Многомерные массивы)
Массив является группой ячеек памяти, логически связанных в том отношении, что все они имеют одно и то же имя и один и тот же тип. Для обращения к конкретной области, или элементу массива, мы указываем имя массива и номер позиции этого элемента в массиве. Массивы занимают определенное место в памяти. Программистом устанавливается тип каждого элемента и число элементов, требуемых для каждого массива, чтобы компьютер мог зарезервировать соответствующий объем памяти. Для указания компьютеру, чтобы он зарезервировал 12 элементов для целочисленного массива с, нужно написать int с[12]; При помощи одного объявления можно зарезервировать память для нескольких массивов. Чтобы зарезервировать 100 элементов для целочисленного массива b и 27 элементов для целочисленного массива х, нужно написать: int b[100], x[27]. Массивы могут объявляться также и для хранения других типов данных. Например, для символьной строки может использоваться массив типа char. Элементы массива также могут инициализироваться при объявлении массива путем помещения вслед за его объявлением знака равенства и списка (заключенного в фигурные скобки) инициализирующих значений, разделенных запятыми. Программа инициализирует целочисленный массив десятью значениями и выводит его в табличной форме. #include < stdio.h> main () { int i, n[10] = {32, 27, 64, 18, 95, 14, 90, 70, 60, 37}; printf(" %s%13s\n", " Element", " Value" ); for (i = 0; i < = 9; i++) printf(" %7d%13d\n", i, n[i]); return 0; } Для передачи массива в качестве параметра функции укажите его имя без всяких скобок. Например, если массив hourlyTemperatures был объявлен как int hourlyTemperatures [24]; оператор вызова функции modifyArray (hourlyTemperatures, 24); передает массив hourlyTemperatures и его размер в функцию modifyArray. При передаче массива в функцию часто передается и размер массива, чтобы функция смогла обработать определенное количество его элементов. С автоматически передает массив в функцию путем имитации передачи параметра по ссылке - при этом вызываемые функции могут изменять значения элементов в исходных массивах вызывающих функций. Ведь имя массива фактически является адресом его первого элемента! Поскольку передается начальный адрес массива, вызываемая функция точно знает, где хранится этот массив. Таким образом, когда вызываемая функция изменяет в своем теле элементы массива, она изменяет подлинные элементы массива в их исходных ячейках памяти. Для предотвращения изменения в функции значений элементов массива в языке С предусмотрен специальный модификатор типа const. Когда параметру-массиву предшествует const, элементы массива становятся константами в теле функции и любая ее попытка изменить элемент массива приводит к ошибке времени компиляции. Сортировка данных (т.е. расположение данных в некотором специальном порядке, например, по возрастанию или убыванию) является одним из наиболее важных применений компьютера. Программа сортирует значения элементов десятиэлементного массива а в порядке их возрастания. Используемая нами методика называется пузырьковой сортировкой или сортировкой погружением, поскольку меньшие значения, подобно воздушным пузырькам в воде, постепенно «всплывают» в верхнюю часть массива, в то время как большие значения опускаются вниз. Метод требует нескольких проходов по массиву. На каждом проходе сравниваются последовательные пары элементов. Если элементы расположены в возрастающем порядке (или если их значения совпадают), мы ничего не меняем. Если элементы пары расположены в убывающем порядке, их значения в массиве меняются местами. #include < stdio.h> #define SIZE 10 main () { int a[SIZE] = {2, 6, 4, 8, 10, 12, 89, 68, 45, 37}; int i, pass, hold; printf(" Data items in original order\n" ); for (i = 0; i < = SIZE - 1; i++) printf(" %4d", a[i]); for (pass = 1; pass < = SIZE - 1; pass++) /*проходы */ for (i = 0; i < = SIZE - 2; i++) /*один проход */ if (a[i] > a[i + 1]) /*одно сравнение */ { hold = a[i]; /* одна перестановка */ a[i] = a[i + 1]; a[i + 1] = hold; } printf (" \nData items in ascending order\n" ); for (i = 0; i < = SIZE - 1; i++) printf(" %4d" a[i]); return 0; } Массивы в С могут иметь несколько индексов. Многомерные массивы часто применяются для представления таблиц, состоящих из значений, упорядоченных по строкам и столбцам. Для идентификации конкретного элемента таблицы мы должны указать два индекса: первый, идентифицирующий (по соглашению) строку элемента, и второй, идентифицирующий столбец. Таблицы, или массивы, требующие двух индексов для идентификации данного элемента, называются двумерными массивами. Многомерный массив, подобно одномерному, может быть инициализирован при его объявлении. Например, двумерный массив b[2][2] может быть объявлен и инициализирован посредством int b[2][2] = {{1, 2}, {3, 4}}; Значения группируются в фигурных скобках по строкам. Таким образом, 1 и 2 инициализируют b[0][0] и b[0][1], 3 и 4 инициализируют Ь[1][0] и Ь[1][1]. Если для данной строки недостаточно инициализирующих значений, оставшиеся ее элементы инициализируются нулями. Таким образом, объявление int b[2][2] = {{1}, {3, 4}}; инициализировало бы b[0][0] единицей, b[0][1] нулем, b[1][0] тройкой и b[1][1] четверкой. Указатели (Объявление и инициализация переменной-указателя, Операции над уазателями, Передача параметра по ссылке, Связь между указателями и массивами, Массивы указателей, указатели на ф-ции) Указатели представляют собой переменные, значениями которых являются адреса памяти. В «обычной» переменной непосредственно содержится некоторое значение. Указатель же содержит адрес переменной, в которой находится конкретное значение. Говорят, что переменная непосредственно ссылается на значение, а указатель косвенно ссылается на значение. Ссылка на значение через посредство указателя называется косвенной адресацией. Указатели, как и любые другие переменные, должны быть объявлены, прежде чем они будут использоваться. В операторе int *countPtr, count объявляется переменная countPtr типа int * (указатель на целочисленное значение), что читается как « countPtr - указатель на целое» или « countPtr указывает на объект типа целое». Кроме того, объявляется переменная count целого типа. Символ * в объявлении распространяется только на countPtr. Этот символ означает, что объявляемая переменная является указателем. Можно объявлять указатели, ссылающиеся на объекты любого типа. Указатели должны быть инициализированы либо при объявлении, либо при помощи оператора присваивания. Указатель может быть инициализирован нулем, макросом NULL или значением адреса. Указатель со значением NULL не указывает ни на что. Символическая константа NULL определяется в файле заголовка < stdio.h> (и в некоторых других заголовочных файлах). Инициализация указателя значением 0 эквивалентна инициализации указателя константой NULL, однако использование NULL предпочтительнее. Когда присваивается значение 0, то происходит его преобразование к указателю соответствующего типа. Значение 0 является единственным целым числом, которое может быть присвоено переменной-указателю непосредственно. Операции над указателями Операция взятия адреса & является унарной операцией, которая возвращает адрес своего операнда. Например, если мы объявим переменные int у = 5; int* yPtr; то следующий оператор yPtr = & у присвоит переменной-указателю yPtr адрес переменной у. После этого можно говорить, что переменная yPtr «указывает на» у. Ниже схематически представлены значения переменных после выполнения приведенного оператора присваивания. Операция *, обычно называемая операцией косвенной адресации или разыменования, возвращает значение объекта, на который операнд (то есть указатель) ссылается. Например, оператор printf (" %d", *yPtr) выводит значение переменной у. Такое использование операции * называется разыменованием указателя. Разыменование указателя, который не был инициализирован или которому не присвоили необходимое значение адреса, приводит к фатальной ошибке во время выполнения программы или случайной порче данных, в результате чего выполнение программы завершается с неверным результатом. Популярное:
|
Последнее изменение этой страницы: 2016-04-10; Просмотров: 826; Нарушение авторского права страницы