Массив - программная конструкция для организации и упорядочивания данных. Основные свойства данной конструкции:
- массив - блок однотипных элементов, число элементов в массиве фиксировано, задается константным выражением или количеством инициирующих элементов при объявлении массива ;
- имя массива - константный указатель, то есть во время выполнения программы всегда указывает на один и тот же адрес - адрес начального элемента блока;
- любой элемент массива определяется его порядковым номером - индексом. Так как имя массива указатель, то обращение к элементам массива аналогично обрщению к элементам памяти, выделенной с помощью указателя;
- нумерация индексов элементов всегда начинается с 0;.
Объявление массива имеет вид:
тип имя_массива [константное_выражение] ; тип имя_массива [ ] = фсо список_иницирующих _значений_через_запятую фсз; тип имя_массива [константное_выражение] = фсо список_иницирующих _значений_через_запятую фсз;
В последнем случае указываемый размер массива и число инициирующих значений должно совпадать. Пример объявления массивов и обращения к элементам массива
const int N = 10; int A[N]; // Объявление массива из 10 элементов типа int for (int i = 0; i<N; i++) A[i] = i*i; // присваивание значения i-му элементу printf ("Адрес массива = x %x\n", A, &A[0]); // Адрес массива (значение уазателя А) = адрес // нулевого(начального) элемента массива совпадают. char C1[] = фсо'A', 'B', 'C', 'D', 'E', 'F' фсз; // Объявление массива из 5 элементов типа char // и инициализация их указанными значениями char C2[] = "ABCDEF"; //массив символов допустимо иницировать текстовой //строкой. Число элементов массива в данном случае //6, так как завершающий нуль-символ '\0'включается //в число инициирующих элементов for (int i = 0; i<5; i++) printf ("C1[%d]=%c C2[%d]=%c \n", i, C1[i], *(c2+i) ); // printf ("C1[5]=%c\n", i, C1[5]); ошибка - выход индекса за границы массива printf ("C2[5]=%d\n", i, C2[5]); // Правильно. Элемент с таким индексом есть
Таким образом, массивы и указатели имеют ряд общих черт:
- указывают на блок памяти, состоящий из однотипных элементов;
- значение указателя или имени массива есть адрес начального элемента блока;
- обращение к элементам осуществляется одинаково для массивов и указателей.
Первое существенное отличие массива от указателя состоит в том, что имя массива - константный указатель, блок памяти под массив выделяется на этапе компиляции приложения и остается неизменным до конца работы приложения. Некостантный указатель с помощью оператора new может многократно в ходе работы приложения менять свое значение, т.е. указывать на разные блоки произвольной в динамической памяти.
Кроме того, указатель и имя массива по-разному интерпретируются функцией sizeof(). Аргументом данной функции является или переменная любого типа, или имя типа. Данная функция возвращает количество байтов, выделенных под переменную или тип. Если аргумент есть имя массива, возвращается размер массива в байтах. Для указателя возвращается всегда значение 4 - размер адреса(32 разряда).