Массивы
Массив - это поименованная совокупность данных, состоящая из фиксированного числа элементов одинакового типа.
В С++ предусмотрено понятие только одномерного массива. Многомерные массивы представляются как массив, состоящий из элементов типа массив.
Доступ к элементам массива осуществляется с помощью индексированной переменной:
per[index];
,где index -целое положительное число от 0 до количества элементов минус 1.
Пример:
int kol[5];//первый элемент-kol[0],...,пятый элемент-kol[4]
При объявлении массива можно одновременно выполнить его инициализацию набором значений,заключённых в фигурные скобки. Массивы символов можно инициализировать строкой символов, указанной в двойных кавычках.
В языке С++ существуют два способа доступа к переменным и функциям: по имени переменной или функции и по адресу с помощью указателей.
Указатель - это переменная, содержащая адрес другой переменной или функции. Использование указателей позволяет упростить алгоритм и повысить его эффективность за счет простого доступа к большим объемам данных с помощью указателя.
В стек копируется не весь объем данных, а только одно число -адрес первого байта данных.
Для доступа к переменной через указатель используется операция разадресации (разыменования, или обращения по адресу,или косвенной адресации)- *. Выражение *ident означает, что нужно извлечь значение по адресу, равному значению указателя ident.
Пример:
//Доступ через указатель
int tabn1,tabn2,*p=&tabn1;
tabn1=1000;
tabn2=*tabn1;//tabn2=1000
Операция разадресации может быть использована также в левой части оператора присваивания для того, чтобы данные были запомнены по адресу, который содержит указатель.
Пример:
int tabn,*p=&tabn;
tabn=1000;
*p=2000;// Значение tabn изменится на 2000
Пример указателей на массивы:
char* naim="Картотека служащих";//Объявление и инициализ.
//указателя адресом строки символов
int tabn[5];
int *p=tabn;//Объявление и инициализация указателя адресом
//первого байта массива,операция & не нужна.
Доступ к элементам массива может осуществляться помимо имени массива (tabn[i]), с помощью указателя(p[i]).
p[i]==*(p+i)
,где p+i -адрес i-го элемента массива tabn,
* -операция разадресации.
Пример указателей на структуры,объединения:
struct tip_rab //Объявление типа структура
{
int tabn;
char fio[20];
float zarp;
};
tip_rab rab; //Объявление переменной типа структура tip_rab
tip_rab *p; //Объявление указателя p на тип tip_rab
p=&rab; //Инициализация указателя p адресом rab
или
tip_rab *p=&rab;//Объявление и инициализация указателя
Доступ к полям структуры осуществляется помимо операции (.)-операции прямого выбора поля структуры (rab.tabn), с помощью операции (->) -операции косвенного выбора поля структуры или операции указателя поля (p->tabn). p->tabn==(*p).tabn.
Определение адреса поля структуры выполняется с помощью операции адресации: &prab->tabn, где операция -> имеет более высокий приоритет.
Над указателями можно выполнять следующие операции:
- операции адресации(&) и разадресации(*);
- операция присваивания(=);
- арифметические операции(+,-,++,--);
- операции сравнения.
Общее правило операций следующее: считается, что указатель указывает на начало совокупности переменных объявленного типа; прибавление к указателю tip*p целого числа n увеличивает содержащийся в нем адрес на число, равное произведению прибавляемого числа на размер переменной в байтах, т.е. на n*sizeof(tip), таким образом,указатель перемещается на n значений или на n*sizeof(tip) байтов.
Размеры типов в байтах для малой модели следующие: char-1, int-2, long-4, float-4, double-8.
Указатели- это удобный способ обработки больших объемов данных: массивов, структур, объединений.
Использование модификатора const определяет, что указатель и/ или указываемая переменная не должны изменяться. Если необходимо, чтобы указываемая переменная не изменялась, нужно записать const перед типом указателя.
Пример:
const int *p=&tabn1;//Указатель на константу типа int
*p=1000;// недопустимо
p=&tabn2;// допустимо
const char *fkart="kartotek.dat";
Если необходимо, чтобы сам указатель не изменялся, нужно записать const после обозначения типа указателя.
Пример:
int * const p=&tabn1;//Постоянный указатель на int
*p=1000;// допустимо
p=&tabn2;// недопустимо
Адрес именной константы не может быть присвоен указателю без const, т.к. такое присваивание могло бы изменить именную константу через указатель.
Пример:
const int kol=25;
const int *p=&kol;// допустимо
int *p=&kol;// недопустимо
Указатели могут агрегироваться в массивы. Массивы указателей обязательно должны быть инициализированы.
Преимущества указателей следующие:
- экономия памяти, более компактное размещение данных;
- эффективное выполнение программы при использовании указателей в качестве параметров функции при передаче агрегированных данных за счет того, что в стек копируется не весь объем данных, а только одно число -адрес первого байта данных;
- возможность изменения значений переменных вызывающей функции при изменении значений параметров вызываемой функции, т.е. возможность возврата значений помимо оператора return;