Определение текущей позиции в файле.

ftell – имеет один аргумент-имя потока и возвращает номер позиции указателя потока в файле.

Пример:

long n;

n = ftell (in);

Указатели

Указатель – это переменная, которая содержит адрес другой переменной соответствующего типа, или точнее говоря адрес первого байта памяти, выделенного под эту переменную.

Зачем нужны указатели:

· Применение указателей в некоторых случаях позволяет упростить алгоритм, делает его эффективнее.

· Обращение к памяти через адрес осуществляется быстрее, особенно для массива.

· С помощью указателей эффективней управляем оперативной памятью. Существуют функции которые позволяют резервировать или освободить блоки памяти в процессе выполнения программы. – этот процесс называется управлением динамической памятью.

· Обмен данными между различными функциями осуществляется эффективней, через адрес переменной передаются большие объемы данных (массивы)

Замечание!!! При работе с адресами следует соблюдать осторожность т.к. при записи в оперативную память по «неправильному» адресу может привести к аварийному завершению программы или всей операционной системы.

Объявление указателя.

Синтаксис: имя_типа*имя_переменной_указателя;

Пример:

1. int * p1; // переменная p1 объявлена как указатель на целый тип данных, т.е. она может содержать адрес любой переменной целого типа.

2. float * p2; // переменная p2 объявлена как указатель переменной типа float т.е. она может содержать адрес переменной типа float.

3. void * p3; // переменная p3 является указателем на тип void т.е. может содержать адрес любого типа, но указатель на тип void используют только для хранения или передачи адреса. Над переменной p3 нельзя производить операций, которые допустимы для указателя.

Инициализация указателей. После объявления переменной - указателя программист обязан поместить в нее “правильный” адрес, только после этого возможны операции над указателями.

Имеются несколько способов инициализации:

· инициализация указателя адресом существующей переменной этого же типа.

float a, *p1;

p1=& a;

· Инициализация указателя с помощью другого указателя, уже правильно инициализированного.

char simv, *p1, *p2;

p1=& simv;

p2=p1;

· Инициализация указателя адресом памяти, выделенной динамически.

Способы выделения памяти под данные:

статическое выделение памяти происходит на этапе компиляции, переменная "живет" и доступна в соответствии с классом памяти.

динамическая память выделяется в процессе выполнения программы по желанию программиста и освобождается также по желанию программиста в любом месте программы

int *p1 = new int; - выделяется память под одну переменную целого типа

int *p2 = new int(5); - выделяется память под одну переменную целого типа и туда помещается значение 5

int *p3 = new int[7]; - выделяется память под семь переменных целого типа, лежащих в памяти подряд

В нужном месте программы память обязательно нужно освободить, иначе она будет занята

delete p1;

delete p2;

delete[]p3;

. Указатель на тип void совместим с любым указателем.

out a, *p1;

void *p2;

p1 = & a;

p2 = (void) p1;

Операции над указателем.

1. Операция обращения по адресу (операция разадресации) * - унарная.

Пример:

1) int a, *p1;

p1 = & a;

*p1 = 7; // операция разадресации- значение по адресу p1равно 7.

2) float p2;

p2 = new float;

*p = 2.5;

3) char simv, *p3;

void *p4;

p3 = & simv;

....................

p4 = (void*) p3;

....................

*((char*) p4) = ‘a’;

2. Два адреса можно сравнить с помощью операции отношения = =, ! =, <, < =, >, > =.

3. К указателю на соответствующий тип можно прибавить целое число m, при этом мы сместимся в памяти в вперед на m переменных этого же типа.

4. От указателя на соответствующий тип можно отнять целое число n, при этом мы сместимся в памяти назад на n переменных этого же типа.

5. Можно найти разность между двумя указателями, и определить на каком расстоянии находится два объекта между собой.

Задача.

Выделить память под три переменные типа float находящихся в оперативной памяти подряд, присвоить значение 1,2,3.

float *x;

x = new float[3];

*x = 1;

*(x+1) = 2;

*(x+2) = 3;

Массивы в языке С++

Массивы позволяют удобным способом размещать и обрабатывать большое количество однотипной информации.

Массив – это набор данных одного типа, имеющих одно и тоже имя, и отличающихся друг от друга по индексу данного массиве. Данные называются элементами массива. Элементы массива размещаются в памяти друг за другом подряд.

Одномерные массивы

Объявление массива.

Синтаксис:

Имя_типа имя_массива[размер массива];

Под размером понимается количество элементов массива. Размер массива всегда константа и должен быть указан.

Пример:

int mas1 [5];

float mas2 [25];

char mas3 [60];

После выделения памяти в элементах массива находится «мусор». При объявлении массива возможна инициализация.

int a[4]={7,-3,8,243};

Если констант меньше, чем необходимо, остальные элементы массива обнуляются. Если констант больше, возникает ошибка компиляции.

Наши рекомендации