Понятие массива. Одномерные массивы со статическим выделением памяти: синтаксис

описания, инициализация и доступ к элементам, пример

Массив – это структурированный тип данных, который описывает фиксированное количество элементов одного типа.

Элементы массива пронумерованы. Нумерация элементов массива в С(С++) начинается с нуля. Порядковый номер элемента массива также называют индексом.

Одномерный массив – это массив каждый элемент которого имеет один индекс.

Чтобы использовать массив, надо его объявить . Массив объявляют так же, как и обычные переменные, но после имени массива в квадратных скобках записывается его размер (число элементов). Тип массива - это тип входящих в него элементов. Массивы могут быть разных типов — int, float, char, и т.д.

Компилятор, встретив объявление массива, выделяет блок памяти заданного размера под элементы массива. При объявлении массива можно сразу заполнить его начальными значениями, перечисляя их внутри фигурных скобок: Если в списке в фигурных скобках записано меньше чисел, чем элементов в массиве, то оставшиеся заполняются нулями. Если чисел больше, чем надо, компилятор сообщает об ошибке.

Размер массива можно определять в директиве препроцессора #define, например #definen 20 означает заменить во всем тексте программы символ n на символ 20.

В современных программах на языке С++ рекомендуется использовать константы вместо директивы #define.

Для доступа к элементу одномерного массива необходима указать имя массива и в квадратных скобках порядковый номер его элемента (индекс).

В языке С (C++) не контролируется выход за границы массива, то есть формально вы можете записать что-то в элемент с несуществующим индексом, например в A[345] или в A[-12]. Однако при этом вы стираете какую-то ячейку в памяти, не относящуюся к массиву, поэтому последствия такого шага непредсказуемы и во многих случаях программа зависает.

Синтаксис объявления одномерного массива:

<тип_элементов>имя_массива[<число_элементов>];

Примеры объявлений массивов:

int A[10], B[4]= { 2, 3, 12, 76 }, С[20] ={0};

#define n 20 int A[n];

const m = 20; int A[m];

intA[]; //Ошибка! Размер массива не известен

int k = 20;

int A[k]; //Ошибка! Размермассива не может быть переменной

Синтаксис обращения к элементу массива:

имя_массива[индекс];

Пример: ints = B[0] + B[3]; // сумма первого и последнего элементов массива B

34. Понятие динамическойпеременной. Как создаются динамические переменные в С и С++? Пример

Переменные, находящиеся в фиксированных областях памяти, называются статическими и объявляются в тексте программы. Память для них резервируется на этапе компиляции.

Существует способ выделения памяти для переменных во время выполнения программы. Такие переменные называются динамическими, они создаются по требованию программы и запоминаются в блоках памяти переменного размера, принадлежащих кспециальным образом организованной области памяти – куче.

Существует несколько способов резервирования памяти в куче для динамических переменных.

Функция mallocрезервирует непрерывный блок ячеек памяти для хранения указанного объекта и возвращает указатель на первую ячейку этого блока. Параметр size - целое беззнаковое значение, определяющее размер выделяемого участка памяти в байтах. Если резервирование памяти прошло успешно, то функция возвращает переменную типа void *, которую можно привести к любому необходимому типу указателя.

Функция callocвыделяет numэлементов по size байт. Эта функция возвращает указатель на выделенный участок или NULL при невозможности выделить память. Особенностью функции является обнуление всех выделенных элементов.

Функция reallocизменяет размер выделенной ранее памяти. Параметр р - указатель на область памяти, размер которой нужно изменить на size. Если в результате работы функции меняется адрес области памяти, то новый адрес вернется в качестве результата. Если фактическое значение первого параметра NULL, то функция realloc работает так же, как и функции malloc, то есть выделяет участок памяти размером size байт.

Для освобождения выделенной памяти используется функция free. Параметр р - указатель на участок память, ранее выделенный функциями malloc, calloc или realloc.

Способы распределения динамической памяти :

-посредством операций new и delete.

int *mas = new int[10]; // динамическиймассив

delete [] mas;

mas –адрес нулевого элемента массива

mas + 1 -адрес первого элемента массива

mas + i -адрес i - го элемента массива

*(mas +i) или mas[i] –способы обращения к i - му элементу массива

inta[5]; // а = &a[0]

35. Понятие динамического массива. Как в С и С++ создаются одномерные динамические

Массивы? Пример

Динамический массив - массив переменной длины, память под который выделяется в процессе выполнения программы. Выделение памяти осуществляется функциями calloc, malloc или оператором new. Адрес первого элемента выделенного участка памяти хранится в переменной, объявленной как указатель. Например, следующий оператор означает, что описан указатель mas и ему присвоен адрес начала непрерывной области динамической памяти, выделенной с помощью оператора new: int *mas=newint[10];

Выделено столько памяти, сколько необходимо для хранения 10 величин типа int.

Фактически, в переменной mas хранится адрес нулевого элемента динамического массива. Следовательно, адрес следующего, первого элемента, в выделенном участке памяти - mas+1, amas+i является адресом i-ro элемента. Обращение к i-му элементу динамического массива можно выполнить, как обычно mas [i], или другим способом * (mas +i). Важно следить за тем, чтобы не выйти за границы выделенного участка памяти.

Когда динамический массив (в любой момент работы программы) перестает быть нужным, то память можно освободить с помощью функции free или оператора delete.

Имя массива является указателем на его нулевой элемент:

-для массива со статическим выделением памяти – это константный указатель;

- для динамического массива – это указатель - переменная.

36. Как связаны массивы и указатели в С и C++? Операции над указателями, примеры

Указатель – это переменная, значением которой является адрес памяти, по которому храниться объект определенного типа (другая переменная).

Как и любая переменная, указатель должен быть объявлен. При объявлении указателей всегда указывается тип переменной, значение которой будет храниться по данному адресу. Звездочка в описании указателя относиться непосредственно к имени, поэтому, чтобы объявить несколько указателей, ее ставят перед именем каждого из них.

При работе с указателями часто используют операции получения адреса (&) и разыменования (*). Операция получения адреса (&) возвращает адрес своего операнда. Операция разыменования (*) возвращает значение переменной, хранящееся по заданному адресу, то есть выполняет действие, обратное операции получения адреса (&).

Значение одного указателя можно присвоить другому. Если указатели одного типа, то для этого применяют обычную операцию присваивания.

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

Арифметические операции над указателями :

-Сложение и вычитание указателей с константой;

-вычитание одного указателя из другого;

-инкремент;

-декремент.

Эти операции применимы только к указателям одного типа и имеют смысл в основном при работе со структурными типами данных, например с массивами.

Сложение и вычитание указателей с константой n означает, что указатель перемещается по ячейкам памяти на столько байт, сколько занимает n переменных того типа, на который он указывает, т. е. n * sizeof( тип).

Разность двух указателей - это разность их значений, деленная на размер типа в байтах, т. е. вычитание двух указателей определяет, сколько переменных данного типа размещается между указанными ячейками. Так, разность указателей на третий и нулевой элементы массива равна трем, а на третий и девятый - шести. Суммирование двух указателей не допускается.

Инкремент перемещает указатель к следующему элементу массива, а декремент - к предыдущему.

К указателям так же применимы операции отношения ==, !=,<,>, <=, >=. Иными словами, указатели можно сравнивать. Например, если i указывает на пятый элемент массива, aj - на первый, то отношение i>j истинно. Кроме того, любой указатель всегда можно сравнить на равенство с нулем.

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

Понятие массива. Как передаются одномерные массивы в качестве параметров в функцию? Примеры

Если в роли параметра функции выступает массив, то в функцию передается адрес его первого элемента (адрес a[0]). В результате, вызываемые функции могут изменять значения элементов в исходных массивах и возвращать их в главную функцию.

Для передачи адреса первого элемента одномерного массива необходимо в списке формальных параметров объявить переменную указатель или имя массива с пустыми квадратными скобками (см. пример).

В списке фактических параметров всегда указывается имя массива без квадратных скобок. Имя статического массива, как уже сказано, является константным указателем на первый элемент массива. Имя динамического массива – переменная указатель.

Информация о количестве элементов массива должна передаваться через отдельный параметр.

Понятие массива. Одномерные массивы со статическим выделением памяти: синтаксис - student2.ru

Понятие массива. Одномерные массивы со статическим выделением памяти: синтаксис - student2.ru

Понятие массива. Как организуется запись одномерного массива в текстовый файл и чтение одномерного массива из текстового файла? Примеры

Наши рекомендации