Koks skirtumas tarp char * const ir const char *?

Koks skirtumas tarp:

 char * const 

ir

 const char * 
196
LB nustatytas 2009-05-21 01:16 Gegužės 21 d. 09:16 1:16 2009-05-21 01:16
@ 17 atsakymų

Skirtumas yra tas, kad const char * yra rodyklė į const char , o char * const yra rodyklė į pastovumą char .

Pirma, nurodyta vertė negali būti pakeista, tačiau rodyklė gali būti. Antra, nurodyta vertė gali skirtis, tačiau rodyklė negali (panaši į nuorodą).

Taip pat yra

 const char * const 

kuris yra pastovus rodiklis pastoviam char'ui (todėl nieko negalima keisti).

Pastaba:

Šios dvi formos yra lygiavertės:

 const char * 

ir

 char const * 

Tiksli priežastis yra aprašyta C ++ standarte, tačiau svarbu pažymėti ir išvengti painiavos. Žinau keletą kodavimo standartų, kuriuos norėčiau:

 char const 

daugiau

 const char 

(su rodykle arba be jo), kad const elemento išdėstymas sutaptų su rodykle const .

268
21 мая '09 в 1:21 2009-05-21 01:21 atsakymas pateikiamas darbui3 gegužės 21 d., 09:21 , 2009-05-21 01:21

Siekiant išvengti painiavos, visada pridėkite const specifikatorių.

 int * mutable_pointer_to_mutable_int; int const * mutable_pointer_to_constant_int; int *const constant_pointer_to_mutable_int; int const *const constant_pointer_to_constant_int; 
67
21 мая '09 в 3:08 2009-05-21 03:08 atsakymas pateikiamas diapirui gegužės 21 d., 09:08 2009-05-21 03:08

const visada keičia tai, kas vyksta prieš jį (kairėje), EXCLUDE, kai ji yra pirmoji tipo deklaracijoje, kur ji pakeičia dalyką, kuris ateina po jo (dešinėje).

Taigi šios dvi vertybės:

 int const *i1; const int *i2; 

jie apibrėžia rodykles į const int . Galite keisti taškus i1 ir i2 , tačiau negalite keisti reikšmės, į kurią jie nurodo.

Tai yra:

 int *const i3 = (int*) 0x12345678; 

apibrėžia rodyklę const visam skaičiui ir inicijuoja jį nukreipti į atmintį 12345678. Galite pakeisti int reikšmę 12345678, tačiau negalite pakeisti i3 nurodyto adreso.

24
21 мая '09 в 1:36 2009-05-21 01:36 atsakymą davė Don McCaughey gegužės 09 d. 1:36 2009-05-21 01:36

const * char yra neteisingas C kodas ir neturi prasmės. Galbūt norėjote paklausti skirtumo tarp const char * ir char const * , arba galbūt tarp const char * ir char * const skirtumo?

Taip pat žiūrėkite:

20
21 мая '09 в 1:22 2009-05-21 01:22 atsakymą pateikė Adam Rosenfield gegužės 21 d., 09:22, 2009-05-21 01:22

const char* - rodyklė pastoviam simboliui char* const - nuolatiniam rodikliui į simbolį const char* const - pastovus rodiklis pastoviam simboliui

12
21 мая '09 в 1:20 2009-05-21 01:20 atsakė Andrew Coleson gegužės 21 d., 09:20 , 2009-05-21 01:20

1) const char * x Čia X daugiausia yra simbolių rodyklė, rodanti pastovią vertę.

2) char * const x reiškia rodyklę į simbolį, kuris yra pastovus, bet ji gali būti pakeista.

3) const char * const x yra 1 ir 2 derinys, o tai reiškia, kad jis yra pastovus rodiklis po simbolį, kuris nurodo pastovią vertę.

4) const * charx sukels kompiliatoriaus klaidą. ji negali būti paskelbta.

5) char const * x lygus 1 punktui.

Nykščio taisyklė yra: jei const turi pavadinimą var, tada rodyklė bus pastovi, tačiau rodyklės vieta gali būti pakeista, kitaip rodyklė nukreips į nuolatinę vietą, o rodyklė gali nukreipti į kitą vietą, tačiau nukreipimo vietos turinys negali būti pakeistas.

7
04 июля '12 в 21:19 2012-07-04 21:19 atsakymą pateikė „ AAnkit “ liepos 4 d. 12 d. 21:19 2012-07-04 21:19

Pirmasis yra sintaksės klaida. Ar turėjote omenyje skirtumą tarp

 const char * mychar 

ir

 char * const mychar 

Tokiu atveju pirmasis yra rodyklė duomenims, kurių negalima keisti, o antrasis yra rodyklė, kuri visada nurodys tą patį adresą.

4
21 мая '09 в 1:21 2009-05-21 01:21 atsakymą pateikė Javier gegužės 21 d., 09:21, 2009-05-21 01:21

Nykščio taisyklė: perskaitykite apibrėžimą iš dešinės į kairę!


const int *foo;

Tai reiškia „ foo taškus ( * ), kurie negali keistis ( const )“.
Programuotojui tai reiškia: "Aš nepakeisiu foo nurodytos vertės".

  • *foo = 123; arba foo[0] = 123; bus neteisingas.
  • foo = > .

int *const foo;

Tai reiškia, kad „ foo negali keisti ( const ) ir taškų ( * ) iki int “.
Programuotojui tai reiškia: "Aš nepakeisiu foo nurodytų atminties adreso."

  • *foo = 123; arba foo[0] = 123; .
  • foo = > bus neteisingas.

const int *const foo;

Vertybės " foo negali keisti ( const ) ir taškų ( * ) iki int , kurios negali keistis ( const )".
Programuotojui tai reiškia: "Aš nepakeisiu foo nurodytos reikšmės, ir aš nepakeisiu adreso, į kurį nurodoma foo ".

  • *foo = 123; arba foo[0] = 123; bus neteisingas.
  • foo = > bus neteisingas.
3
atsakymas pateikiamas p. 08 июля '16 в 3:59 2016-07-08 03:59 Lama liepos 16 d., 16 d., 03:59 2016-07-08 03:59

Kita nykščio taisyklė yra patikrinti, kur yra :

  • prieš * => vertė išsaugota pastovi
  • po * => rodiklis pats yra pastovus
2
25 янв. atsakymą pateikė Aadishri sausio 25 d 2013-01-25 12:43 '13, 12:43, 2013-01-25 12:43
  • Rodyklės konstantos . Pastovus rodiklis gali rodyti tik vieną atitinkamo tipo duomenų kintamąjį visoje programoje. Mes galime pakeisti rodiklio nurodytą kintamojo vertę. Inicijavimas turi būti atliekamas pačioje deklaracijoje.

Sintaksė:

 datatype *const var; 

char *const yra įtrauktas į šį atvejį.

  #include<stdio.h> int main(){ int a=10; int *const ptr= *ptr=100; printf("%d",*ptr); return 0; } 
  1. Rodyklė į konst . Šiame rodiklyje gali būti nurodytas bet kokio tipo atitinkamų tipų kintamųjų skaičius, tačiau šiuo konkrečiu laiku negalime keisti rodyklės nurodyto objekto vertės.

Sintaksė:

const datatype *var arba datatype const *var

šiuo atveju yra įtrauktas const char* .

  #include<stdio.h> int main(){ int a=10,b=20; int const *ptr= printf("%d\n",*ptr);  ptr= printf("%d",*ptr);  return 0; } 
1
23 окт. Goutham Gundapu atsakymas, pateiktas spalio 23 d 2015-10-23 16:55 '15 at 16:55 2015-10-23 16:55

char * const ir const char *?

  • Pastovios vertės nurodymas

const char * p; // vertė negali būti pakeista

  1. Nuolatinis rodiklis į vertę

char * const p; // adresas negali būti pakeistas

  1. Nuolatinis rodiklis į pastovią vertę

const char * const p; // abu negalima keisti.

1
27 нояб. atsakymą pateikė „ Yogeesh HT“ . 2015-11-27 13:49 '15 at 1:49 PM 2015-11-27 13:49

Čia pateikiamas išsamus kodo paaiškinimas.

  // these are the three conditions, // const char *p;const char * const p; pointer value cannot be changed // char * const p; pointer address cannot be changed // const char * const p; both cannot be changed. #include<stdio.h>    
1
04 марта '13 в 13:21 2013-03-04 13:21 Atsakymą pateikė Megharaj kovo 13 d. 13:21 2013-03-04 13:21

const modifikatorius taikomas iš karto į kairę. Vienintelė išimtis yra ta, kai iš jos nieko nėra, tada ji nurodo, kas yra iš karto dešinėje.

Tai visi lygiaverčiai būdai pasakyti „pastovus žymeklis pastoviam char “:

  • const char * const
  • const char const *
  • char const * const
  • char const const *
1
21 июля '16 в 7:31 2016-07-21 07:31 atsakymas pateikiamas galois liepos 16, 16, 07:31 2016-07-21 07:31

Du taisyklės

  • If const is between char and *, it will affect the left one.
  • If const is not between char and *, it will affect the nearest one.

Pavyzdžiui.

  • char const *. This is a pointer points to a constant char.
  • char * const. This is a constant pointer points to a char.
1
17 нояб. Atsakymas pateikiamas Xinpei Zhai 17 lapkričio. 2016-11-17 09:14 '16 at 9:14 2016-11-17 09:14

Manau, kad tai reiškia const char * ir char * const.

Pirmasis, const char *, yra rodyklė pastoviam simboliui. Rodiklis pats keičiamas.

Antra, char * const yra nuolatinis rodyklės požymis. Rodyklė negali būti pakeista - tai gali būti simbolis.

Ir tada yra const char * const, kur rodyklė ir simbolis negali keistis.

1
21 мая '09 в 1:21 2009-05-21 01:21 atsakė Michaelui gegužės 21 d., 09:21, 2009-05-21 01:21

Daugelyje atsakymų pateikiami konkretūs metodai, taisyklės ir pan., Kad suprastumėte šį konkrečią kintamojo deklaravimo atvejį. Tačiau yra bendras būdas suprasti bet kurį skelbimą:

Taisyklė laikrodžio rodyklė / spiralė

A)

 const char *a; 

Pagal laikrodžio rodyklę / spiralės taisyklę, a rodyklė yra pastovaus pobūdžio. Tai reiškia, kad simbolis yra pastovus, tačiau rodiklis gali keistis. tai yra, a = "other string"; puikus, bet a[2] = 'c'; negalės surinkti

C)

 char * const a; 

Pagal a taisyklę a yra rodyklė const. t.y. galite padaryti a[2] = 'c'; bet jūs negalite padaryti a = "other string";

0
14 апр. atsakymas pateikiamas PnotNP 14 balandžio. 2017-04-14 21:01 '17 at 9:01 pm 2017-04-14 21:01
 // Some more complex constant variable/pointer declaration. // Observing cases when we get error and warning would help // understanding it better. int main(void) { char ca1[10]= "aaaa"; // char array 1 char ca2[10]= "bbbb"; // char array 2 char *pca1= ca1; char *pca2= ca2; char const *ccs= pca1; char * const csc= pca2; ccs[1]='m'; // Bad - error: assignment of read-only location '*(ccs + 1u)' ccs= csc; // Good csc[1]='n'; // Good csc= ccs; // Bad - error: assignment of read-only variable 'csc' char const **ccss=  // Good char const **ccss1=  // Bad - warning: initialization from incompatible pointer type char * const *cscs=  // Good char * const *cscs1=  // Bad - warning: initialization from incompatible pointer type char ** const cssc=  // Good char ** const cssc1=  // Bad - warning: initialization from incompatible pointer type char ** const cssc2=  // Bad - warning: initialization discards 'const' // qualifier from pointer target type *ccss[1]= 'x'; // Bad - error: assignment of read-only location '**(ccss + 8u)' *ccss= ccs; // Good *ccss= csc; // Good ccss= ccss1; // Good ccss= cscs; // Bad - warning: assignment from incompatible pointer type *cscs[1]= 'y'; // Good *cscs= ccs; // Bad - error: assignment of read-only location '*cscs' *cscs= csc; // Bad - error: assignment of read-only location '*cscs' cscs= cscs1; // Good cscs= cssc; // Good *cssc[1]= 'z'; // Good *cssc= ccs; // Bad - warning: assignment discards 'const' // qualifier from pointer target type *cssc= csc; // Good *cssc= pca2; // Good cssc= ccss; // Bad - error: assignment of read-only variable 'cssc' cssc= cscs; // Bad - error: assignment of read-only variable 'cssc' cssc= cssc1; // Bad - error: assignment of read-only variable 'cssc' } 
0
23 апр. Gopalshankar atsakymas, pateiktas balandžio 23 d 2015-04-23 20:38 '15, 20:38, 2015-04-23 20:38

Kiti klausimai apie žymes arba Užduoti klausimą