Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Массивы (Объявление массивов, Передача массивов в функции, Сортировка массивов, Многомерные массивы)



Массив является группой ячеек памяти, логически связанных в том отно­шении, что все они имеют одно и то же имя и один и тот же тип. Для обраще­ния к конкретной области, или элементу массива, мы указываем имя массива и номер позиции этого элемента в массиве.

Массивы занимают определенное место в памяти. Программистом уста­навливается тип каждого элемента и число элементов, требуемых для каждого массива, чтобы компьютер мог зарезервировать соответствующий объем памя­ти. Для указания компьютеру, чтобы он зарезервировал 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; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.022 с.)
Главная | Случайная страница | Обратная связь