Студопедия — Int *ptr; // объявили указатель на целую переменную
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Int *ptr; // объявили указатель на целую переменную






ptr = &x; // взяли адрес переменной х = 2

y = *ptr; // переменная y стала равной 1

*ptr = 0; // переменная х стала равной 0


Пример объявления указателя:

int *ptr;

Следует помнить, что любой указатель может указывать только на объекты одного конкретного типа данных, заданного при объявлении [1]. Унарный оператор * есть оператор косвенного доступа. Примененный к указателю он выдает объект, на который данный указательс сылается. Одноместные (унарные) операции * и &; имеют более высокий приоритет для своих операндов, чем арифметические операции.

Для указателей одного типа можно, например, выполнять присваивание без разыменования. Это вытекает из того, что указатели сами по себе являются переменными. Пусть определен еще один указатель типа int, например ptr2. Тогда возможно произвести присвоение:

ptr2 = ptr;

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

В языке С допустимы следующие основные операции над указателями: присваивание; получение значения того объекта, на который он указывает (синонимы: косвенная адресация, разыменование, раскрытие ссылки); получение адреса самого указателя; унарные операции изменения значения указателя; аддитивные операции и операции сравнений (отношений) [3].

Унарные операций «++» и «––» позволяют позиционировать указатель на следующую и предыдущую ячейки памяти, в которых хранятся значения типов, связанных с типом указателя. При этом значение указателя меняется на величину, определяемую размером соответствующего типа.

Например, для указателя типа char** операция «++» увеличит значение адреса на sizeof (char), для указателя типа int* операция «--» уменьшит значение адреса на sizeof (int) и так далее. Это свойство унарных операций «++» и «––» используется для последовательного обращения к значениям одного типа, связанного с типом указателя, хранящимся в смежных ячейках памяти. В таком смысле унарные операции «++» и «––» сходны с операциями увеличения и уменьшения счетчика цикла при последовательном обращении к элементам массива.

Следует особо остановиться на указателях и квалификаторе (модификаторе) const. Как известно, квалификатор const превращает переменную в константу, значение которой не должно меняться. Например, нет смысла изменять число p. Значение константы должно быть инициализировано в месте ее определения. В связи с этим различают указатели на константы и константные указатели [6]. Приведем пример:

long value = 9999L;

const long *pvalue = &value;

Последняя строчка данного кода представляет собой указатель на константу. Попытка указателю pvalue присвоить иное числовое значение будет восприниматься компилятором как ошибка [6]. Но само значение переменной value изменять допустимо. При этом указатель держит адрес переменной, значение которой изменилось. В то же время саму переменную также можно объявить с помощью квалификатора const. В этом случае нельзя изменять ни переменную, ни значение указателя (т. е. присвоить иное числовое значение указателю). Указатели на константы часто используются как формальные параметры функций (о функциях будет сказано позднее).

Константный указатель может адресовать как константу, так и переменную. В случае, когда определен константный указатель, через него нельзя уже брать адрес другой переменной. Рассмотрим пример определения константного указателя:

int count = 43;

int *const pcount = &count;

Вторая строчка приведенного кода определяет и инициализирует константный указатель pcount, который «привязан» к адресу переменной count. Если определить новую переменную того же типа, то взять адрес новой переменной с помощью константного указателя pcount будет нельзя, компилятор сделает сообщение об ошибке и работа программы станет невозможной. В то же время возможно изменить значение константного указателя через другое числовое значение. Но это повлечет за собой изменение переменной, адрес которой содержится в указателе. Например,

int count = 43;

int *const pcount = &count;

pcount = 345;

В приведенном коде переменная count будет иметь значение 345 [6].

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

const int card = 21;

const int *const pcard = &card;

Перечисленные особенности указателей с квалификатором const присущи и переменных (объектам) других типов.

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


 







Дата добавления: 2015-09-06; просмотров: 504. Нарушение авторских прав; Мы поможем в написании вашей работы!



Картограммы и картодиаграммы Картограммы и картодиаграммы применяются для изображения географической характеристики изучаемых явлений...

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

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Ученые, внесшие большой вклад в развитие науки биологии Краткая история развития биологии. Чарльз Дарвин (1809 -1882)- основной труд « О происхождении видов путем естественного отбора или Сохранение благоприятствующих пород в борьбе за жизнь»...

Этапы трансляции и их характеристика Трансляция (от лат. translatio — перевод) — процесс синтеза белка из аминокислот на матрице информационной (матричной) РНК (иРНК...

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

Тактические действия нарядов полиции по предупреждению и пресечению групповых нарушений общественного порядка и массовых беспорядков В целях предупреждения разрастания групповых нарушений общественного порядка (далееГНОП) в массовые беспорядки подразделения (наряды) полиции осуществляют следующие мероприятия...

Механизм действия гормонов а) Цитозольный механизм действия гормонов. По цитозольному механизму действуют гормоны 1 группы...

Алгоритм выполнения манипуляции Приемы наружного акушерского исследования. Приемы Леопольда – Левицкого. Цель...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия