Кваліфікатор конст можна застосувати до оголошення будь-якої змінної, щоб вказати, що її значення не буде змінено (що залежить від того, де зберігаються змінні const, ми можемо змінити значення змінної const за допомогою покажчика). Результат визначається реалізацією, якщо робиться спроба змінити константу.
Використання кваліфікатора const у C є хорошою практикою, коли ми хочемо переконатися, що деякі значення повинні залишатися постійними та не повинні бути випадково змінені.
fmovies Індія
У програмуванні на C кваліфікатор const можна використовувати в різних контекстах для забезпечення різних дій. Ось декілька різних випадків використання кваліфікатора const у C:
1. Постійні змінні
const int var = 100;>
У цьому випадку const використовується для оголошення змінної був як константа з початковим значенням 100. Значення цієї змінної не можна змінити після її ініціалізації. Перегляньте наступний приклад:
C
// C program to demonstrate that constant variables can not> // be modified> #include> int> main()> {> > const> int> var = 100;> > // Compilation error: assignment of read-only variable> > // 'var'> > var = 200;> > return> 0;> }> |
>
>
Вихід
./Solution.cpp: In function 'int main()': ./Solution.cpp:11:9: error: assignment of read-only variable 'var' var = 200; ^>
2. Покажчик на константу
const int* ptr;>
АБО
int const *ptr;>
Ми можемо змінити вказівник на будь-яку іншу цілочисельну змінну, але не можемо змінити значення об’єкта (сутності), на який вказує вказівник ptr. Покажчик зберігається в області читання-запису (в даному випадку стек). Об’єкт, на який вказано, може бути в області лише для читання або читання-запису. Розглянемо наступні приклади.
Приклад 1:
C
char до рядка java
// C program to demonstrate that the pointer to point to> // any other integer variable, but the value of the object> // (entity) pointed can not be changed> #include> int> main(> void> )> {> > int> i = 10;> > int> j = 20;> > /* ptr is pointer to constant */> > const> int> * ptr = &i;> > printf> (> 'ptr: %d
'> , *ptr);> > /* error: object pointed cannot be modified> > using the pointer ptr */> > *ptr = 100;> > ptr = &j;> /* valid */> > printf> (> 'ptr: %d
'> , *ptr);> > return> 0;> }> |
>
>
Вихід
./Solution.c: In function 'main': ./Solution.c:12:10: error: assignment of read-only location '*ptr' *ptr = 100; ^>
Приклад 2: Програма, де сама змінна i є постійною.
C
// C program to demonstrate that the pointer to point to> // any other integer variable, but the value of the object> // (entity) pointed can not be changed> #include> int> main(> void> )> {> > /* i is stored in read only area*/> > int> const> i = 10;> > int> j = 20;> > /* pointer to integer constant. Here i> > is of type 'const int', and &i is of> > type 'const int *'. And p is of type> > 'const int', types are matching no issue */> > int> const> * ptr = &i;> > printf> (> 'ptr: %d
'> , *ptr);> > /* error */> > *ptr = 100;> > /* valid. We call it up qualification. In> > C/C++, the type of 'int *' is allowed to up> > qualify to the type 'const int *'. The type of> > &j is 'int *' and is implicitly up qualified by> > the compiler to 'const int *' */> > ptr = &j;> > printf> (> 'ptr: %d
'> , *ptr);> > return> 0;> }> |
>
>
Вихід
./Solution.c: In function 'main': ./Solution.c:18:10: error: assignment of read-only location '*ptr' *ptr = 100; ^>
Понижена кваліфікація не дозволено в C++ і може викликати попередження в C. Погана кваліфікація відноситься до ситуації, коли кваліфікований тип присвоюється некваліфікованому типу.
Приклад 3: Програма для підтвердження кваліфікації.
C
linux запустити cmd
// C program to demonstrate the down qualification> #include> int> main(> void> )> {> > int> i = 10;> > int> const> j = 20;> > /* ptr is pointing an integer object */> > int> * ptr = &i;> > printf> (> '*ptr: %d
'> , *ptr);> > /* The below assignment is invalid in C++, results in> > error In C, the compiler *may* throw a warning, but> > casting is implicitly allowed */> > ptr = &j;> > /* In C++, it is called 'down qualification'. The type> > of expression &j is 'const int *' and the type of ptr> > is 'int *'. The assignment 'ptr = &j' causes to> > implicitly remove const-ness from the expression &j.> > C++ being more type restrictive, will not allow> > implicit down qualification. However, C++ allows> > implicit up qualification. The reason being, const> > qualified identifiers are bound to be placed in> > read-only memory (but not always). If C++ allows> > above kind of assignment (ptr = &j), we can use 'ptr'> > to modify value of j which is in read-only memory.> > The consequences are implementation dependent, the> > program may fail> > at runtime. So strict type checking helps clean code.> > */> > printf> (> '*ptr: %d
'> , *ptr);> > return> 0;> }> |
>
>
перетворення рядка на дату
Вихід
main.c: In function ‘main’: main.c:16:9: warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 16 | ptr = &j; | ^ *ptr: 10 *ptr: 20>
3. Постійний покажчик на змінну
int* const ptr;>
Наведене вище оголошення є постійним вказівником на цілочисельну змінну, що означає, що ми можемо змінити значення об’єкта, на який вказує вказівник, але не можемо змінити вказівник на іншу змінну.
приклад
C
// C program to demonstrate that the value of object pointed> // by pointer can be changed but the pointer can not point> // to another variable> #include> int> main(> void> )> {> > int> i = 10;> > int> j = 20;> > /* constant pointer to integer */> > int> *> const> ptr = &i;> > printf> (> 'ptr: %d
'> , *ptr);> > *ptr = 100;> /* valid */> > printf> (> 'ptr: %d
'> , *ptr);> > ptr = &j;> /* error */> > return> 0;> }> |
>
>
Вихід
./Solution.c: In function 'main': ./Solution.c:15:9: error: assignment of read-only variable 'ptr' ptr = &j; /* error */ ^>
4. Константа Покажчик на константу
const int* const ptr;>
Наведене вище оголошення є постійним вказівником на постійну змінну, що означає, що ми не можемо змінити значення, на яке вказує вказівник, а також ми не можемо вказувати вказівник на інші змінні. Давайте розберемося на прикладі.
C
розбиття рядків c++
// C program to demonstrate that value pointed by the> // pointer can not be changed as well as we cannot point the> // pointer to other variables> #include> int> main(> void> )> {> > int> i = 10;> > int> j = 20;> > /* constant pointer to constant integer */> > const> int> *> const> ptr = &i;> > printf> (> 'ptr: %d
'> , *ptr);> > ptr = &j;> /* error */> > *ptr = 100;> /* error */> > return> 0;> }> |
>
>
Вихід
./Solution.c: In function 'main': ./Solution.c:12:9: error: assignment of read-only variable 'ptr' ptr = &j; /* error */ ^ ./Solution.c:13:10: error: assignment of read-only location '*ptr' *ptr = 100; /* error */ ^>
Переваги const Qualifiers у C
Спеціаліст const у C має такі переваги:
- Покращена читаність коду: позначаючи змінну як const, ви вказуєте іншим програмістам, що її значення не слід змінювати, що полегшує розуміння та підтримку вашого коду. Покращена безпека типу: використовуючи const, ви можете гарантувати, що значення не будуть випадково змінені, зменшуючи ймовірність помилок у вашому коді. Покращена оптимізація: компілятори можуть ефективніше оптимізувати змінні const, оскільки вони знають, що їхні значення не змінюватимуться під час виконання програми. Це може призвести до швидшого та ефективнішого коду. Краще використання пам’яті: оголошуючи змінні як const, ви часто можете уникнути необхідності робити копії їхніх значень, що може зменшити використання пам’яті та підвищити продуктивність. Покращена сумісність: оголошуючи змінні як const, ви можете зробити свій код більш сумісним з іншими бібліотеками та API, які використовують змінні const. Покращена надійність: використовуючи const, ви можете зробити свій код більш надійним, оскільки ви можете гарантувати, що значення не будуть змінені несподівано, зменшуючи ризик помилок у вашому коді.
Резюме
Тип | Декларація | Зміна значення покажчика (*ptr = 100) | Зміна значення вказівки (ptr = &a) |
---|---|---|---|
Покажчик на змінну | int * ptr | Так | Так |
Покажчик на константу | const int * ptr int const * ptr | Немає | Так |
Постійний покажчик на змінну | int * const ptr | Так | Немає |
Константа Покажчик на константу | const int * const ptr | Немає | Немає |
Ця стаття складена Нарендра Кангралкар .