Karsinta konst voidaan soveltaa minkä tahansa muuttujan ilmoitukseen sen määrittämiseksi, että sen arvoa ei muuteta (joka riippuu siitä, mihin const-muuttujat on tallennettu, voimme muuttaa const-muuttujan arvoa osoittimen avulla). Tulos on toteutusmääritelmä, jos yritetään muuttaa konstia.
Const-määritteen käyttö C:ssä on hyvä käytäntö, kun haluamme varmistaa, että jotkin arvot pysyvät vakioina eikä niitä saa muuttaa vahingossa.
java trimmausmerkkijono
C-ohjelmoinnissa const-tunnistetta voidaan käyttää eri yhteyksissä erilaisten käyttäytymismallien tarjoamiseen. Tässä on joitain erilaisia käyttötapauksia const-määrittimelle C:ssä:
1. Vakiomuuttujat
const int var = 100;>
Tässä tapauksessa const käytetään muuttujan ilmoittamiseen oli vakiona, jonka alkuarvo on 100. Tämän muuttujan arvoa ei voi muuttaa, kun se on alustettu. Katso seuraava esimerkki:
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;> }> |
>
>
Lähtö
./Solution.cpp: In function 'int main()': ./Solution.cpp:11:9: error: assignment of read-only variable 'var' var = 200; ^>
2. Osoitin vakioon
const int* ptr;>
TAI
int const *ptr;>
Voimme muuttaa osoittimen osoittamaan mihin tahansa muuhun kokonaislukumuuttujaan, mutta emme voi muuttaa objektin (entiteetin) arvoa, joka osoitti osoittimella ptr. Osoitin tallennetaan luku-kirjoitusalueelle (pino tässä tapauksessa). Osoitettu objekti voi olla vain luku- tai luku-kirjoitusalueella. Katsotaanpa seuraavat esimerkit.
Esimerkki 1:
C
char merkkijonoon 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;> }> |
>
>
Lähtö
./Solution.c: In function 'main': ./Solution.c:12:10: error: assignment of read-only location '*ptr' *ptr = 100; ^>
Esimerkki 2: Ohjelma, jossa muuttuja i itse on vakio.
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;> }> |
>
>
Lähtö
./Solution.c: In function 'main': ./Solution.c:18:10: error: assignment of read-only location '*ptr' *ptr = 100; ^>
Alempi pätevyys ei ole sallittu C++:ssa ja se voi aiheuttaa varoituksia C:ssä. Downin hyväksyntä viittaa tilanteeseen, jossa hyväksytty tyyppi määritetään ei-hyväksyttyyn tyyppiin.
sql satunnaisessa järjestyksessä
Esimerkki 3: Ohjelma pätevyyden osoittamiseksi.
C
// 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;> }> |
>
>
javassa
Lähtö
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. Jatkuva osoitin muuttujaan
int* const ptr;>
Yllä oleva ilmoitus on vakio osoitin kokonaislukumuuttujaan, mikä tarkoittaa, että voimme muuttaa osoittimen osoittaman objektin arvoa, mutta emme voi muuttaa osoitinta osoittamaan toiseen muuttujaan.
Esimerkki
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;> }> |
>
>
Lähtö
./Solution.c: In function 'main': ./Solution.c:15:9: error: assignment of read-only variable 'ptr' ptr = &j; /* error */ ^>
4. Vakioosoitin vakioon
const int* const ptr;>
Yllä oleva ilmoitus on vakioosoitin vakiomuuttujaan, mikä tarkoittaa, että emme voi muuttaa osoittimen osoittamaa arvoa, emmekä voi osoittaa osoitinta muihin muuttujiin. Katsotaanpa esimerkillä.
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;> }> |
>
>
Lähtö
./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-karsinnan edut C:ssä
Const-karsinnassa C:ssä on seuraavat edut:
lihavoitu teksti css:ssä
- Parannettu koodin luettavuus: Merkitsemällä muuttujan const, osoitat muille ohjelmoijille, että sen arvoa ei pidä muuttaa, mikä helpottaa koodin ymmärtämistä ja ylläpitoa. Parannettu tyyppiturvallisuus: Käyttämällä const-toimintoa voit varmistaa, että arvoja ei muuteta vahingossa, mikä vähentää virheiden mahdollisuutta koodissasi. Parannettu optimointi: Kääntäjät voivat optimoida const-muuttujia tehokkaammin, koska he tietävät, että niiden arvot eivät muutu ohjelman suorittamisen aikana. Tämä voi johtaa nopeampaan ja tehokkaampaan koodiin. Parempi muistin käyttö: Ilmoittamalla muuttujat const-muodossa, voit usein välttää niiden arvojen kopioimisen, mikä voi vähentää muistin käyttöä ja parantaa suorituskykyä. Parannettu yhteensopivuus: Määrittämällä muuttujat const-muotoon, voit tehdä koodistasi yhteensopivamman muiden const-muuttujia käyttävien kirjastojen ja sovellusliittymien kanssa. Parempi luotettavuus: Const-sovelluksella voit tehdä koodistasi luotettavamman, koska voit varmistaa, että arvoja ei muuteta odottamatta, mikä vähentää virheiden riskiä koodissasi.
Yhteenveto
Tyyppi | julistus | Osoittimen arvon muutos (*ptr = 100) | Osoitusarvon muutos (ptr = &a) |
---|---|---|---|
Osoitin muuttujaan | int * ptr | Joo | Joo |
Osoitin vakioon | const int * ptr int const * ptr | Ei | Joo |
Jatkuva osoitin muuttujaan | int * const ptr | Joo | Ei |
Vakioosoitin vakioon | const int * const ptr | Ei | Ei |
Tämän artikkelin on koonnut Narendra Kangralkar .