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

Указатели



Смысл этого по­нятия в Си/Си++ остается тем же: указатель — это адрес поля памяти, занимаемого программным объектом.

Пусть в программе определены три переменные разных типов:

int а=5;

char с='G';

float r =1.2Е8;

Эти величины разместились в памяти компьютера следующим образом:

Память FFС0 FFС1 FFС2 FFСЗ FFС4 FFС5 FFС6
Переменные а с r
Значения   'G' 1.2*108

Операция & — адрес. Применение этой операции к имени пе­ременной дает в результате ее адрес в памяти. Для переменных из данного выше примера: &а равно FFСО, &с - FFС2, &r – FFC3.

Описание указателей. Для хранения адресов используются пе­ременные типа «указатель». Формат описания таких переменных следующий:

тип *имя переменной

Примеры описания указателей:

int *pti; char *ptc; float *ptf;

После такого описания переменная pti может принимать зна­чение указателя на величину целого типа; переменная ptc пред­назначена для хранения указателя на величину типа char; пере­менная ptf — на величину типа float.

Указателям могут присваиваться значения адресов объектов только того типа, с которым они описаны. В нашем примере допу­стимы операторы: pti=&а; ptc=&с; ptf=&r;

В результате указатели примут следующие значения:

pti – FFC0, ptc - FFС2, ptf- FFC3.

Как и для других типов данных, значения указателей могут Инициализироваться при описании. Например:

int а=5; int *pti=&а;

char с='G'; char *ptc=&с;

float r =1.2Е8; float *ptf=&r;

В заголовочном файле stdio.h определена константа — нуле­вой указатель с именем NULL. Ее значение можно присваивать ука­зателю. Например:

ptf=NULL;

Не надо думать, что после этого указатель ptf будет ссылаться на нулевой байт памяти. Нулевой указатель обозначает отсутствие конкретного адреса ссылки.

Использованный в описаниях указателей символ * (звездоч­ка) в данном контексте является знаком операции разадресации. С ее помощью можно сослаться через указатель на соответствую­щую переменную.

После приведенных выше описаний в записи выражений этой программы взаимозаменяемыми становятся а и *pti, с и *ptc, r и *ptf

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

Продемонстрируем это правило на определенных выше указа­телях. Выполнение операторов

pti=рti+1; или pti++

изменит значение указателя pti на 2, в результате чего он примет значение FFС2. В результате выполнения оператора pti - - значе­ние

указателя уменьшится на 2 и станет равным FFBE.

Аналогично для указателей других типов:

ptc++; увеличит значение указателя на 1;

ptf ++; увеличит значение указателя на 4.

Использование указателей для передачи параметров функции. Рас­сматривая ранее правила использования функций, мы обращали внимание на то, что в языке Си возможна только односторонняя передача значений фактических параметров из вызывающей про­граммы к формальным параметрам вызываемой функции. Возвра­щаемое значение несет сама функция, используемая в качестве операнда в выражении. Отсюда, казалось бы, следует неукосни­тельное правило: в процессе выполнения функции не могут изме­няться значения переменных в вызывающей программе. Однако это правило можно обойти, если в качестве параметров функции использовать указатели.

В следующем примере функция swap () производит обмен зна­чениями двух переменных величин, заданных своими указателя­ми в аргументах.

void swap(int *а,int*b)

{ int с;

с=*а; *а=*b; *b=с;

}

Если в основной программе имеется следующий фрагмент:

int х=1,у=2;

swap(&х,&у);

printf("х=%d у=%d",х,у);

то на экран будет выведено: х=2 у=1

т. е. переменные х и у поменялись значениями.

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

этими значениями являются указатели. После обращения к функ­ции указатель а получил адрес переменной х, указатель b — ад­рес переменной у. После этого переменная х в основной програм­ме и разадресованный указатель *а в функции оказываются свя­занными с одной ячейкой памяти; так же — у и *b.





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



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