Указатель на константные данные — КиберПедия 

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Указатель на константные данные

2020-05-08 173
Указатель на константные данные 0.00 из 5.00 0 оценок
Заказать работу

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

Программа на рис. 11 делает попытку изменить указатель-константу. Указатель ptr объявлен как int * const. Объявление должно читаться справа налево и в данном случае будет звучать как «ptr — указатель-константа на целое число». Указатель инициализирован адресом переменной х целого типа. Программа пытается присвоить указателю ptr адрес у, в результате чего выдается сообщение об ошибке.

 

 /* Попытка изменения указателя-константы на */

/* не-константные данные */

# include < stdio. h >

main () {

int x, у;

int *const ptr = &x;

ptr = & y;

return 0;       }

 

Вывод на экран

Compiling FIG7_13.C:

Error FIG7_13.C 10:

Cannot modify a const object

Warning FIG7_13.C 12: 'ptr' is assigned a value that is

never used Warning FIG7_13.C 12: 'y' is declared but never used

Рис. 11. Попытка изменения указателя-константы, ссылающегося на не-константные данные

Минимальные права доступа предоставляет указатель-константа на константные данные. Указатель всегда указывает на то же самое место в памяти, а расположенные по этому адресу данные не могут модифицироваться. Этому варианту соответствует передача массива функции, которая только просматривает массив при помощи индекса и не изменяет его элементы. В программе на рис. 12 объявляется переменная-указатель ptr типа const int * const. Объявление читается справа налево и звучит так: «ptr — указатель-константа на целую константу». На рисунке показаны сообщения об ошибках, полученных в результате попытки изменить данные, на которые указывает ptr, и изменить присвоенный указателю адрес.

/* Попытка модификации указателя-константы на */

/* данные-константы */

# include < stdio. h >

main ()

int x = 5, y;

const int *const ptr = &x;

* ptr = 7;

ptr = & y;

return 0;

}

   

Вывод на экран

Compiling FIG7_14.C:

Error FIG7_14.C 10: Cannot modify a const object

Error FIG7_14.C 11: Cannot modify a const object

Warning FIG7_14.C 13: 'ptr' is assigned a value that is

never used

Warning FIG7_14.C 13: 'y' is declared but never used

Рис. 12. Попытка изменить константный указатель на константные данные

 

Выражения и арифметические операции с указателями

К указателям применяются только следующие операции: увеличение (++), уменьшение (--), прибавление и вычитание целого число (+,- или +=,-=), разность двух указателей.

На рис. 13 изображен массив int v[10], первый элемент которого будет имеет адрес в памяти, равный 3000. Указатель vPtr инициализируется значением адреса v[0], т. е. 3000. Для того, чтобы vPtr указывал на массив v, его можно инициализировать любым из следующих операторов:

vPtr = v; vPtr = &v[0];

В обычной арифметике результатом сложения 3000 + 2 будет значение 3002. В арифметике указателей при прибавлении или вычитании из указателя целого числа значение его увеличивается или уменьшается не на это число на размер объекта, на который указатель ссылается.

Рис. 13. Массив v и указатель vPtr, ссылающийся на v

 

Размер объекта в байтах зависит от типа объекта. Например, оператор

vPtr += 2;

даст результат 3008 (3000 + 2*4), если для целого числа отводится в памяти 4 байта. Теперь vPtr будет ссылаться на элемент v[2] (см рис. 14).

При увеличении или уменьшении указателя на единицу можно использовать операции инкремента (++) и декремента (--).

++vPtr; vPtr++, --vPtr; vPtr --;

Переменные-указатели могут вычитаться друг из друга. Например, если значение vPtr равно 3000, a v2Ptr содержит адрес 3008, то в результате выполнения оператора

х = v2Ptr - vPtr;

переменной х будет присвоено число элементов массива, расположенных начиная с адреса vPtr и до v2Ptr – для целых чисел это будет значение 2. Обычно арифметические операции с указателями используются при работе с массивами.

Указатель может быть присвоен другому указателю, если оба указателя имеют один и тот же тип. Для разных типов нужно использовать операцию приведения типа указателя в правой части оператора присваивания к типу указателя в левой части. Исключением из этого правила является указатель на void (т.е. типа void *), который является обобщенным указателем и может представлять любой тип указателя. Указатель любого типа может быть присвоен указателю на void, и void-указатель может быть присвоен указателю любого типа. В обоих случаях применение операции приведения типа не требуется.

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

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


Поделиться с друзьями:

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.