Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Одномерные массивы. Объявление и инициализация. Индексирование элементов.

Поиск

Массив – это структура однотипных элементов, занимающих непрерывную область памяти. Массив имеет имя, тип и размерность. Формат описания:

имя_типа имя [константное выражение]

Константное выражение определяет размер массива, т.е. число элементов в массиве.

Элементы массива обозначаются индексированными именами. Нижнее значение индекса – ноль.

Констант выр. м не указывать, если на этапе объявления происходит инициализация массива:

int x[] = { 1, 3, 5 };

int A[10];

или const n=10;

int A[n];

В Си нельзя определять произвольные диапазоны для индекса. Размер массива, указанный в описании, всегда на 1-цу больше максимального значения индекса.

Доступ к элементам массива производится посредством обращения к конкретному необходимому элементу массива. Например, объявлен массив из 6-ти элементов (int massive[6]), тогда его, например, 4-ым элементом является massive[4] и т.д.

Массив может быть инициализирован при объявлении. Например: int massive[6]={1,2,3,4,5,6}.

 

18. Двухмерные массивы. Инициализация безразмерных массивов Двумерный массив трактуется в языке Си как одномерный массив, элементом которого является массив с указанным в описании типом элементов. Отдельные величины этого массива обозначаются именами с 2-мя индексами. Порядок расположения элементов многомерных массивов в памяти таков, что прежде всего меняется последний индекс, затем предпоследний и т.д.

(19) При описании многомерных массивов их можно инициализировать. Элементы в двумерном массиве запоминаются строками, следовательно, при переборе их в том порядке, как они расположены в памяти, чаще будет изменяться самый правый индекс. Массив инициализируется списком начальных значений, заключенным в фигурные скобки; каждая строка двумерного массива инициализируется соответствующим подсписком. Если двумерный массив передается функции в качестве аргумента, то объявление соответствующего ему параметра должно содержать количество столбцов; количество строк в данном случае несущественно, поскольку, как и прежде, функции будет передан указатель на массив строк, каждая из которых есть массив. Инициализация массива – это присваивание элементам массива некоторых начальных значений.

Если размер массива не известен, то он считается равным числу инициализаторов, при этом тип его

становится завершенным. Если размер массива известен, то число инициализаторов не должно превышать

числа его элементов; если инициализаторов меньше, оставшиеся элементы обнуляются.

Самый простой способ инициализации следующий: в процессе объявления массива можно указать в

фигурных скобках список инициализаторов:

float arr[6] = {1.1, 2.2, 3.3, 4.0, 5, 6};

int a[3][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, …, 15};

int a[3][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15}};

Количество инициализаторов не обязано совпадать с количеством элементов массива. Если

инициализаторов меньше, то оставшиеся значения элементов неопределенны.

(20)

Для доступа к элементам массива существует два различных способа. Первый способ связан с использованием обычных индексных выражений в квадратных скобках, например, array[16]=3 или array[i+2]=7. При таком способе доступа записываются два выражения, причем второе выражение заключается в квадратные скобки. Одно из этих выражений должно быть указателем, а второе - выражением целого типа. Последовательность записи этих выражений может быть любой, но в квадратных скобках записывается выражение следующее вторым. Поэтому записи array[16] и 16[array] будут эквивалентными и обозначают элемент массива с номером шестнадцать. Указатель используемый в индексном выражении не обязательно должен быть константой, указывающей на какой-либо массив, это может быть и переменная. В частности после выполнения присваивания ptr=array доступ к шестнадцатому элементу массива можно получить с помощью указателя ptr в форме ptr[16] или 16[ptr].

 

Второй способ доступа к элементам массива связан с использованием адресных выражений и операции разадресации в форме *(array+16)=3 или *(array+i+2)=7. При таком способе доступа адресное выражение равное адресу шестнадцатого элемента массива тоже может быть записано разными способами *(array+16) или *(16+array).

При реализации на компьютере первый способ приводится ко второму, т.е. индексное выражение преобразуется к адресному. Для приведенных примеров array[16] и 16[array] преобразуются в *(array+16).

21 Инициализация указателей.

После того, как указатель был объявлен, но до того, как ему было присвоено какое-то значение, указатель содержит неизвестное значение. Попытка использовать указатель до присвоения ему какого-то значения является ошибкой. Она может нарушить работу не только программы, но и операционной системы. Даже если этого не произошло, результат работы программы будет неправильным и найти эту ошибку будет достаточно сложно. Принято считать, что указатель, который указывает в "никуда", должен иметь значение Null. Однако и это не делает его "безопасным". После того, как он попадет в левую или правую части оператора присваивания, он вновь может стать "опасным". С другой стороны, нулевой указатель можно использовать, например, для обозначения конца массива

указателей. Если была попытка присвоить какое-либо значение тому, на что указывает указатель с нулевым значением, система выдает предупреждение, появляющееся во время работы программы (или

после окончания работы программы).

"Null pointer assignement"

Появление этого сообщения указывает программисту осуществить поиск использования

неинициализированного указателя в программе.

 

22. Операции получения адреса & и ссылка *

Указатель — это адрес объекта в памяти. Переменная типа "указатель" (или просто переменная-указатель) — это специально объявленная переменная, в которой хранится указатель на переменную определенного типа.

С указателями связаны 2 спец операции: & и *. Обе эти операции явл унарными, т.е. имеют 1 операнд, перед кот они ставятся. Операция & соот-ет операции «взять адрес». Операция * соотв-ет словам «значение, расположенное по указанному адресу».

Унарные операции & и * имеют наивысший приоритет наравне с унарным минусом.

 

25 Функции динамического распределения памяти

Основу системы динамического распределения в С составляют функции malloc() и free(). Эти функции работают совместно. Функция malloc() выделяет память, а free() — освобождает ее. Это значит, что при каждом запросе функция malloc() выделяет требуемый участок свободной памяти, a free() освобождает его, то есть возвращает системе. В программу, использующую эти функции, должен быть включен заголовочный файл <stdlib.h>.

Указатели используются для динамического выделения памяти компьютера для хранения данных. Динамическое распределение означает, что программа выделяет память для данных во время своего выполнения. Память для глобальных переменных выделяется во время компиляции, а для нестатических локальных переменных — в стеке. Память, выделяемая в С функциями динамического распределения данных, находится в т.н. динамически распределяемой области памяти (heap). Динамически распределяемая область памяти — это свободная область памяти, не используемая программой, операционной системой или другими программами. Размер динамически распределяемой области памяти заранее неизвестен, но как правило в ней достаточно памяти для размещения данных программы.

Прототип функции malloc() следующий:

void *malloc(size_t количество_байтов);

Здесь количество_байтов — размер памяти, необходимой для размещения данных. (Тип size_t определен в <stdlib.h> как некоторый целый без знака.) Функция malloc() возвращает указатель типа void *, поэтому его можно присвоить указателю любого типа. При успешном выполнении malloc() возвращает указатель на первый байт непрерывного участка памяти, выделенного в динамически распределяемой области памяти. Если в динамически распределяемой области памяти недостаточно свободной памяти для выполнения запроса, то память не выделяется и malloc() возвращает нуль.

Функция free() имеет следующий прототип:

void free(void * p)

Здесь р — указатель на участок памяти, выделенный перед этим функцией malloc(). Функцию free() ни в коем случае нельзя вызывать с неправильным аргументом, это мгновенно разрушит всю систему распределения памяти.

Подсистема динамического распределения в С используется совместно с указателями для создания различных программных конструкций, таких как связные списки и двоичные деревья.

 

27-28. Функции. Определения функций. Прототипы функций.

Оператор return вызывает немедленный выход из данной ф-ции и возврат в вызывающую ее ф-цию. Этот оператор также исп-ся для возврата рез-та работы ф-ции.в теле ф-ции м/б неск операторов return, но может и не быть ни одного. В таких случаях возврат в вызываюшую ее ф-цию происходит после выполн-я последнего оператора.

 



Поделиться:


Последнее изменение этой страницы: 2016-04-07; просмотров: 754; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.124.23 (0.006 с.)