Использование модификатора const с указателями — КиберПедия 

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

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

Использование модификатора const с указателями

2020-05-08 223
Использование модификатора const с указателями 0.00 из 5.00 0 оценок
Заказать работу

Модификатор const дает возможность программисту сообщить компилятору о том, что значение указанной переменной не должно изменяться.

Существует четыре способа передать функции указатель:

· изменяемый указатель на изменяемые данные,

· неизменяемый указатель на изменяемые данные,

· изменяемый указатель на неизменяемые данные

· неизменяемый указатель на неизменяемые данные.

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

Самый высокий уровень доступа предоставляется не-константным указателям на не-константные данные.

Функция convertToUppercase, приведенная на рис. 8, объявляет параметром указатель — не константу на неконстантные данные (char * s). Функция обрабатывает строку s посимвольно, используя арифметические операции над указателем. Если символ находится в диапазоне от а до z, то он преобразуется в соответствующий символ верхнего регистра от А до Z с помощью вычислений, основанных на ASCII-кодах символов; в противном случае символ не изменяется и обрабатывается следующий символ в строке.

/* Преобразование символов нижнего регистра в символы верхнего */

/* регистра с использованием указателя-не константы на данные, */

/* которые могут модифицироваться */

# include < stdio. h >

void convertToUppercase (char *);

main()

{

char string[] = "characters";

printf("The string before conversion is: %s\n", string);

convertToUppercase (string);

printf("The string after conversion is: %s\n", string);

return 0;

}

void convertToUppercase(char *s)

{

while (*s! = '\0') {

if (*s >= 'a' && *s <= ' z')

    * s -= 32; /* Преобразование к верхнему регистру */

.    ++ s; /* увеличение s для перехода к следующему символу */

}

 

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

The string before conversion is: characters

The string after conversion is: CHARACTERS

Рис. 8. Преобразование строки к верхнему регистру с использованием не константного указателя на не константные данные

Указатель — не константа на данные-константы — это указатель, который может изменяться и ссылаться на любой объект данных соответствующего типа, но элемент данных, на которые он указывает, не может изменяться. Такой указатель мог бы использоваться для передачи массива в качестве аргумента функции, которая обрабатывает каждый элемент массива и при этом не изменяет данные. Например, приведенная на рис. 9 функция printCharacters объявляет параметр s, типа const char *. Объявление читается справа налево, и звучит как «s — указатель на символ-константу». В теле функции для вывода символов строки используется цикл for, который завершается при достижении конца строки. После вывода очередного символа производится увеличение указателя для перехода к следующему символу в строке.

/ * Посимвольный вывод строки, использующий */

/ * не-константный указатель на константные данные * /

#include <stdio.h>

void printCharacters (const char *);

 main ()

 { char string [] = "print characters of a string";

printf("The string is:\n");

printCharacters (string);' i';i':   putchar (' \n ');

.return 0;

}

void printCharacters (const char *s)

{ for (; * s!= '\0'; s ++) /* цикл не инициализируется */

.. putchar (*s);

}

 

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

The string is:

 print characters of a string

Рис. 9. Посимвольный вывод строки с использованием указателя - не константы на константные данные

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

На рис. 10 проиллюстрирована попытка изменения константных данных неконстантного указателя.

 

/* Попытка изменения данных при помощи */

/* неконстантного указателя на данные-константы */

#include <stdio.h>

void f (const int. *);

main ()

{

int y;

f (& y); /* функция f пытается выполнить изменение данных */ return 0; i

void f (const int *x) {

* x = 100; /* нельзя модифицировать объект данных типа const */ }

 

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

Compiling FIG7_12.C:

Error FIG7_12.C 17: Cannot modify a const object

Warning FIG7_12.C 18: Parameter 'x' is never used

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


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

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

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

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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...



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

0.012 с.