Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Указатели



В языке С++ существуют два способа доступа к переменным и функциям: по имени переменной или функции и по адресу с помощью указателей.

Указатель - это переменная, содержащая адрес другой переменной или функции. Использование указателей позволяет упростить алгоритм и повысить его эффективность за счет простого доступа к большим объемам данных с помощью указателя.

В стек копируется не весь объем данных, а только одно число -адрес первого байта данных.

Для доступа к переменной через указатель используется операция разадресации (разыменования, или обращения по адресу,или косвенной адресации)- *. Выражение *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;

Ссылки

Альтернативой указателям являются ссылки.

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

Пример: ссылка указатель

int tabn=1000; int tabn=1000;

int &r=tabn; int *p=&tabn;

cout<<r<<'\n';//r=1000 cout<<*p<<'\n';//*p=1000

tabn=2000; tabn=2000;

cout<<r<<'\n';//r=2000 cout<<*p<<'\n';//*p=2000

r=3000; *p=3000;

cout<<tabn<<'\n';//tabn=3000 cout<<tabn<<'\n';//tabn=3000

Результаты примеров с ссылкой и указателем одинаковы. Но использование ссылки по сравнению с указателем более удобно, так как ссылка пишется как обычная переменная и не требует операций адресации(&) и разадресации(*). Ссылка r определяет местоположение в памяти переменной tabn. При изменении значения tabn (tabn=2000;) ссылка r получает это новое значение. При изменении значения ссылки (r=3000) переменная tabn получает это новое значение. Более точнее можно сказать следующее об операциях над ссылкой. Операция присваивания ссылке r значения 3000 не изменяет ссылку, т.е. ссылка r всегда ссылается на int tabn, а операция присваивания применяется к переменной tabn.

Таким образом, операции выполняются не над ссылками, а над переменными, на которые они ссылаются. Ссылку образно можно рассматривать, как константный указатель, который всегда разадресован. Необходимо подчеркнуть, что ссылка не является копией переменной, а является вторым именем (алиасом, псевдонимом) этой переменной.

Ссылки используются в качестве формальных параметров функций при передаче агрегированных данных (структур, объединений). При вызове функции автоматически вычисляется адрес фактического параметра (переменной вызывающей функции) и помещается в стек, затем копия адреса присваивается формальному параметру (ссылке). Аналогично выполняется возврат значения функции по ссылке. Возвращать ссылку, как и указатель, на локальную переменную нельзя.

Преимущества ссылок заключаются в следующем:

- эффективное выполнение программы при использовании ссылок в качестве параметров функций при передаче агрегированных данных (как и указатели);

- возможность изменения значений переменных вызывающей функции при изменении значений параметров вызываемой функции, т.е. возможность использования ссылок для возврата значений помимо оператора return (как и указатели);

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

Типы данных, определяемые пользователем:





Дата публикования: 2014-11-26; Прочитано: 342 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...