Массив может иметь инициализацию, если массив имеет инициализацию, то размерность можно не указывать, она определяется по умолчанию.
int a1[4]={ 2, 5, 9, 10 }; // Массив из 4-х элементов
int a2[7]={ 3, 4, 5 }; // Массив из 7 элементов, проинициализированы первые 3
char c1[]={ ‘A’, ‘g’, ‘1’, ‘y’, ‘I’ }; // Массив из 5 элементов,
// размерность определяется по умолчанию
Если массив объявлен за пределами блоков, то по умолчанию его элементы инициализируются 0.
Массивы и указатели
Имя массива, используемое внутри выражения без [] является указателем на первый элемент массива (элемент с индексом 0). Данный указатель является константным, т.е. его значение нельзя изменять.
Для некоторого массива, например
int A[10];
выполняется равенство A==&A[0]
Доступ к элементу массива возможен или через индексное выражение или через операцию обращения по адресу.
for (int i=0; i<10; i++) A[i]=2*i;
for (int i=0; i<10; i++) *(A+i)=2*i; // Наличие скобок обязательно,
// так как приоритет операции * выше, чем операции +
|
|
Кроме того имя массива без скобок является указателем, тип которого соответствует указателю на тип элемента массива. Допустим следующий порядок работы с массивом:
int a[10];
int *p;
p=a;
for(int i=0; i<10; i++) p[i]=i*i;
или
for(int i=0; i<10; i++) *(p+i)=i*i;
Строки
Строка – это символьный массив, заканчивающийся символом с кодом 0 (символ NULL) – это служебный символ, являющийся признаком конца строки.
Практически все стандартные функции, работающие со строками, используют это свойство для определения конца строки.
Примеры:
char str[]=“ABCD”; // Это строка, выделяется память под 5 символов (последний 0)
char c[]={‘A’, ‘B’, ‘C’, ‘D’ }; // Это просто массив из 4-х символов
char *s=“Пример строки”; // Допустимо такое определение строки
Зная признак конца строки можно, например, вычислить длину строки.
int len=0; // Длина строки
for(; s[len]; len++);
Динамические массивы
Память для массива может выделяться и уничтожаться динамически с помощью специальных функций, например, для выделения памяти могут использоваться функции: malloc, calloc, realloc, а для освобождения памяти функция free (в Си++ существуют специальные операторы new и delete). Особенно это удобно в том случае, когда число элементов заранее не известно, а становится известным только во время выполнения программы, например, число элементов может вычисляться при работе программы, вводится с клавиатуры и т.д.
Функция malloc имеет заголовок, определенный в заголовочном файле stdlib.h:
void * malloc(unsigned int _Size);
Данная форма заголовка является упрощенной, функция имеет один параметр, определяющий размер выделяемой динамически области памяти в байтах, функция возвращает указатель на выделяемую область памяти, тип указателя void *, что обеспечивает его неявное приведение к указателям на любые стандартные типы.
|
|
Возвращает выделенную память обратно операционной системе функция с упрощенным заголовком (заголовочный файл stdlib.h):
void free(void * _Memory);
Функция имеет один параметр – указатель на блок освобождаемой памяти.
Ниже представлен пример выделения памяти под массив, размерность которого вводится с клавиатуры, далее массив заполняется случайными числами, выводится на печать, в конце работы программы выделенная память освобождается.
#include <stdio.h>
#include <stdlib.h>
void main()
{
int *p; // Указатель, может быть использован для выделения памяти под массив динамически
int n; // Заранее неизвестное число элементов массива
int i; // Индексная переменная
printf("n="); scanf("%d", &n); // Ввод с клавиатуры числа элементов массива
p=malloc(n*sizeof(int)); // Выделяем память под массив динамически
// Заполняем массив случайными числами и печатаем его
for(i=0; i<n; i++)
{
p[i]=rand() % 100; // Получаем псевдослучайное целое число в интервале
// 0..99
printf("%d ", p[i]);
}
free(p); // Возвращаем выделенную память операционной системе, когда она не нужна
}
Многомерные массивы
Многомерный массив – это массив массивов.
Пример определения:
int A[2][3];
Данное определение можно раскрыть следующим образом: А – массив из двух элементов, элементами массива являются массивы из трех элементов типа int.
Элементы следуют в памяти в следующем порядке:
A[0][0], A[0][1], A[0][2], A[1][0], A[1][1], A[1][2]
Обращаться к элементам массива можно с помощью индексного выражения или с помощью указателей
A[0][1]=5;
A[i][j]=i+j; // или
*(*(A+i)+j)=i+j;
Инициализация многомерных массивов
Инициализация многомерных массивов может проводиться по аналогии с одномерными массивами. Например:
int A[2][3][2]={ 1, 2, 3, 4, 5};
Инициализируются первые 5 элементов по их расположению в оперативной памяти, т.е. элементы с индексами: 000, 001, 010, 011, 020
Но удобнее использовать вложенные фигурные скобки, при этом самая левая размерность может не указываться, а определяться по умолчанию:
int B[][5]={{ 1, 2, 3}, { 6, 7}, { 1, 2, 3, 4, 5 }};
В примере создается массив размерности 3 × 5 (аналог матрицы 3 × 5, при этом в первой строке инициализируются 3 элемента, во второй – 2 элемента, в третьей – все 5 элементов).