Краткие теоретические сведения. Массив – это упорядоченная последовательность переменных одного типа
Массив – это упорядоченная последовательность переменных одного типа. Каждому элементу массива отводится одна ячейка памяти. Элементы одного массива занимают последовательно расположенные ячейки памяти. Все элементы имеют одно имя – имя массива и отличаются индексами – порядковыми номерами в массиве. Количество элементов в массиве называется его размером. Чтобы отвести в памяти нужное количество ячеек для размещения массива, надо заранее знать его размер. Резервирование памяти для массива выполняется на этапе компиляции программы.
2.1. Определение массива в C/C++
Массивы определяются следующим образом:
int a[100];//массив из 100 элементов целого типа
Операция sizeof(a) даст результат 400, т. е. 100 элементов по 4 байта.
Элементы массива всегда нумеруются с 0.
значения элементов массива | |||||
….. | индексы элементов массива |
Чтобы обратиться к элементу массива, надо указать имя массива и номер элемента в массиве (индекс):
a[0] – индекс задается как константа,
a[55] – индекс задается как константа,
a[i] – индекс задается как переменная,
a[2*i] – индекс задается как выражение.
Элементы массива можно задавать при его определении:
int a[10]={1,2,3,4,5,6,7,8,9,10};
int a[]={1,2,3,4,5};
Понятие указателя
Указатели являются специальными объектами в программах на C/C++. Указатели предназначены для хранения адресов памяти.
Когда компилятор обрабатывает оператор определения переменной, например, int i=10;, то в памяти выделяется участок памяти в соответствии с типом переменной (для int размер участка памяти составит 4 байта) и записывает в этот участок указанное значение. Все обращения к этой переменной компилятор заменит адресом области памяти, в которой хранится эта переменная.
Рис. 3. Значение переменной и ее адрес
Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указателями. Указатель не является самостоятельным типом, он всегда связан с каким-то другим типом.
В простейшем случае объявление указателя имеет вид:
тип* имя;
Знак *, обозначает указатель и относится к типу переменной, поэтому его рекомендуется ставить рядом с типом, а от имени переменной отделять пробелом, за исключением тех случаев, когда описываются несколько указателей. При описании нескольких указателей знак * ставится перед именем переменной-указателя, т. к. иначе будет не понятно, что эта переменная также является указателем.
int* i;
double *f, *ff;//два указателя
char* c;
Размер указателя зависит от модели памяти. Можно определить указатель на указатель: int** a;
Указатель может быть константой или переменной, а также указывать на константу или переменную.
int i; //целая переменная
const int ci=1; //целая константа
int* pi; //указатель на целую переменную
const int* pci; //указатель на целую константу
Указатель можно сразу проинициализировать:
//указатель на целую переменную
int* pi=&i;
С указателями можно выполнять следующие операции:
· разыменование (*);
· присваивание;
· арифметические операции (сложение с константой, вычитание,
инкремент ++, декремент --);
· сравнение;
· приведение типов.
Операция разыменования предназначена для получения значения переменной или константы, адрес которой хранится в указателе. Если указатель указывает на переменную, то это значение можно изменять, также используя операцию разыменования.
int a; //переменная типа int
int* pa=new int; //указатель и выделение памяти под //динамическую переменную
*pa=10;//присвоили значение динамической
//переменной, на которую указывает указатель
a=*pa;//присвоили значение переменной а
Арифметические операции применимы только к указателям одного типа.
· Инкремент увеличивает значение указателя на величину sizeof(тип).
char* pc;
int* pi;
double* pd;
. . . . .
pc++; //значение увеличится на 1
pi++; //значение увеличится на 4
pd++; //значение увеличится на 8
· Декремент уменьшает значение указателя на величину sizeof(тип).
· Разность двух указателей – это разность их значений, деленная на размер типа в байтах.
Суммирование двух указателей не допускается.
· Можно суммировать указатель и константу: