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

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

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

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

2020-05-08 220
Использование модификатора 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. Попытка изменить данные, используя неконстантный


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

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

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

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

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...



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

0.009 с.