Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Смысл этого понятия в Си/Си++ остается тем же: указатель — это адрес поля памяти, занимаемого программным объектом.
Пусть в программе определены три переменные разных типов:
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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!