Массивы и указатели
Массивы
Массивы удобны для обработки больших объемов информации. Массив представляет собой набор однотипных объектов, имеющих общее имя и различающихся местоположением (или индексом, присвоенным каждому элементу массива).
Элементы массива занимают один непрерывный участок памяти компьютера и располагаются последовательно друг за другом.
Объявление массивов.
Пример 13. Объявления массивов.
int mas1[492]; // внешний массив из 492 элементов целого типа
main ()
{
double mas2[250]; // массив из 250 вещественных чисел двойной точности
char mas3[20]; // статическая строка из 20 символов
int mas4[2][4]; // двумерный массив из целых чисел из 2-х сток и 4-х столбцов
}
В данном примере идентификаторы перед квадратными скобками [ ] являются именами массивов. Число в квадратных скобках определяет количество элементов массива.
Доступ к отдельному элементу массива организуется по номеру этого элемента, или индексу. Нумерация элементов массива начинается с нуля и заканчивается n-1, где n — число элементов массива.
Пример 14. Описание массива и присваивание начальных значений его элементам.
int mas[2]; //объявление массива
int a=10,b=5; //объявление переменных
mas[0]=a;
mas[l]=b;
Инициализация массивов
Инициализация массива означает присвоение начальных значений его элементам при объявлении.
Массивы можно инициализировать списком значений или выражений, отделенных запятой, заключенным в фигурные скобки.
Пример 15. Инициализация массива, элементы которого содержат количество дней в каждом месяце года:
int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
Если список инициализируемых значений короче длины массива, то инициализации подвергаются первые элементы массива, а остальные инициализируются нулем.
Массив также можно инициализировать списком без указания в скобках длины массива. При этом массиву присваивается длина по количеству инициализаторов.
Пример 16. Определение количества элементов массива при инициализации.
char code[] = {'a','b','c'};
В данном примере массив code будет иметь длину 3.
Если же массив явно не проинициализирован, то внешние и статические массивы инициализируются нулями. Автоматические же массивы после объявления ничем не инициализируются и содержат неизвестную информацию.
Указатели
Каждая ячейка памяти имеет две характеристики – адрес и значение.
В программировании имя переменной это символическое обозначение ее значения. В языке С++ кроме имен переменных существуют указатели.
Указатель — это символическое обозначение адреса.
Операции с указателями
В C++ имеются две в каком-то смысле обратные друг другу операции:
- операция определения адреса – & и
- операция косвенной адресации – *.
С помощью операции & определяется адрес ячейки памяти, содержащей заданную переменную. Например, если vr — имя переменной, то &vr — адрес этой переменной или указатель на переменную vr. Указатель &vr — это число, которое является константой типа указатель.
В C++ также существуют и переменные типа указатель. Значением переменной типа указатель служит адрес переменной или объекта. Пусть переменная типа указатель имеет имя ptr, тогда в качестве значения ей можно присвоить адрес переменной vr с помощью следующего оператора:
ptr=&vr;
Противоположная операция косвенной адресации * позволяет обратиться к переменной не напрямую по имени, а косвенно через указатель, содержащий адрес этой переменной.
Данная операция является унарной и выполняется слева направо. Ее не следует путать с бинарной операцией умножения.
Пусть ptr — указатель, тогда *ptr — это значение переменной, на которую указывает ptr.
Тогда:
a=b; // присвоит переменной а значение переменной b
ptr=&b; // присвоит переменной а значение переменной b через указатель
a=*ptr;
Объявление и использование указателей
Объявление указателей выполняется с помощью операторов вида:
<тип переменной> *<имя указателя на переменную заданного типа>;
Пример 17. Объявления указателей.
int *ptri; //указатель на переменную целого типа
char *ptrc; //указатель на переменную символьного типа
float *ptrf; //указатель на переменную с плавающей точкой
Такой способ объявления указателей возник из-за того, что переменные разных типов занимают различное число ячеек памяти.
Пример 18. Использование указателей.
int a=10, b=5;
int *ptr=&a; //инициализация указателя адресом переменной а
соut << "Адрес переменной a = "<< рtr << "\n Значение переменной a ="<<*ptr;
ptr=&b; //теперь ptr указывает на переменную b
соut << "Адрес переменной b = "<< рtr << "\n Значение переменной b ="<<*ptr;
Отметим, что без указателей невозможна обработка объектов. Например, передать объект некоторой функции можно только через указатель.
УКАЗАТЕЛИ И МАССИВЫ
Поскольку указатели представляют собой символические адреса объектов, то это дает возможность программисту использовать адреса подобно тому, как используются переменные, и тем самым повысить эффективность программы.
В языке C++ имя массива является константным указателем адреса элемента массива с нулевым индексом.
Пусть mas[6] — массив из шести элементов.
Тогда записи mas и &mas[0] эквивалентны и определяют адрес 1-го элемента массива.
Оба значения являются константами типа указатель, поскольку они не изменяются на протяжении всей работы программы. Однако эти значения можно присваивать переменным типа указатель.
