Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Топ:
Проблема типологии научных революций: Глобальные научные революции и типы научной рациональности...
Устройство и оснащение процедурного кабинета: Решающая роль в обеспечении правильного лечения пациентов отводится процедурной медсестре...
Теоретическая значимость работы: Описание теоретической значимости (ценности) результатов исследования должно присутствовать во введении...
Интересное:
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Распространение рака на другие отдаленные от желудка органы: Характерных симптомов рака желудка не существует. Выраженные симптомы появляются, когда опухоль...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Дисциплины:
2020-05-08 | 173 |
5.00
из
|
Заказать работу |
|
|
Указатель-константа на не-константные данные — указатель, который всегда указывает на одно и то же место в памяти, а расположенные там данные могут изменяться, по умолчанию назначается для имени массива. Имя массива является указателем-константой на начало массива. Ко всем элементам массива можно обращаться и изменять их, используя имя массива и индекс. Константный указатель на не-константные данные может использоваться для передачи массива как параметра функции, которая обращается к его элементам, используя только индекс массива. Указатели, которые объявляются с модификатором 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!