18 ответов:
разница в том, что
const char *указатель наconst char, аchar * constявляется постоянным указателем наchar.первое значение, указывает не может быть изменено, но указатель может быть. Во-вторых, значение, на которое указывают, может измениться, но указатель не может (подобно ссылке).
есть еще и
const char * constпостоянный указатель на константу типа char (так что об этом не может быть измененный.)
Примечание:
следующие две формы эквивалентны:
const char *и
char const *точная причина этого описана в стандарте C++, но важно заметить и избежать путаницы. Я знаю несколько стандартов кодирования, которые предпочитают:
char constover
const char(с указателем или без него) так что размещение
constэлемент такой же, как и с указателемconst.
чтобы избежать путаницы, всегда добавить квалификатор const.
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;
constвсегда изменяет то, что приходит перед ним (слева от него), за исключением тех случаев, когда это первая вещь в объявлении типа, где он изменяет то, что приходит после него (справа от него).Итак, эти двое-одно и то же:
int const *i1; const int *i2;они определяют указатели на
const int. Вы можете изменить, гдеi1иi2очки, но вы не можете изменить значение, на которое они указывают.это:
int *const i3 = (int*) 0x12345678;определяет a
constуказатель к целому числу и инициализирует его, чтобы указать на ячейку памяти 12345678. Вы можете изменитьintзначение по адресу 12345678, но вы не можете изменить адрес, чтоi3указывает.
const * charявляется недопустимым кодом C и не имеет смысла. Возможно, вы хотели спросить разницу между aconst char *иchar const *, или, возможно, разница междуconst char *иchar * const?Читайте также:
const char*- это указатель на константу-символchar* const- это константный указатель на символconst char* const- это постоянный указатель на постоянный символ
1) const char* x здесь X-это в основном указатель символов, который указывает на постоянное значение
2) char * const x относится к указателю символа, который является постоянным, но местоположение, на которое он указывает, может быть изменено.
3) const char* const x является комбинацией 1 и 2, означает, что это постоянный указатель символов, который указывает на постоянное значение.
4) const *char x вызовет a ошибка компилятора. он не может быть объявлен.
5) char const * x равно точке 1.
эмпирическое правило: если const С именем var, то указатель будет постоянным, но расположение указателя может быть изменено , еще указатель будет указывать на постоянное местоположение и указатель может указывать на другое место, но содержимое указывающего местоположения не может быть изменено.
правило: прочитайте определение справа налево!
const int *foo;значит "
fooточки (*) кintэто не может измениться (const)".
Для программиста это означает "Я не буду менять стоимостью чтоfooочков".
*foo = 123;илиfoo[0] = 123;будет недействительным.foo = &bar;is допустимый.
int *const foo;значит "
fooне может изменить (const) и точки (*) кint".
Для программиста это означает "Я не буду менять адрес в памяти этоfooотносится к".
*foo = 123;илиfoo[0] = 123;разрешено.foo = &bar;будет недействительным.
const int *const foo;значит "
fooне может изменить (const) и очки (*) кintэто не может измениться (const)".
Для программиста это означает "Я не буду менять стоимостью чтоfooуказывает на, и я не буду менять адрес этоfooотносится к".
*foo = 123;илиfoo[0] = 123;будет недействительным.foo = &bar;будет недействительным.
первый-это синтаксическая ошибка. Возможно, вы имели в виду разницу между
const char * mycharи
char * const mycharв этом случае первый является указателем на данные, которые не могут измениться, а второй-указателем, который всегда будет указывать на один и тот же адрес.
еще одно правило большого пальца-проверить, где const is:
- до *=>стоимостью хранятся постоянный
- после *=>указатель и постоянный
многие ответы предоставляют конкретные методы, правило больших пальцев и т. д., Чтобы понять этот конкретный экземпляр объявления переменной. Но есть общая методика понимания любого объявления:
A)
const char *a;согласно правилу по часовой стрелке / спирали
a- это указатель на символ, который является постоянным. Это означает, что символ является постоянным, но указатель можете изменить. то естьa = "other string";- это хорошо, ноa[2] = 'c';не будет компилироватьсяБ)
char * const a;как правило,
a- это указатель const на символ. т. е. вы можете сделатьa[2] = 'c';но вы не можете сделатьa = "other string";
Я полагаю, вы имеете в виду const char * и char * const .
первый, const char *, является указателем на постоянный символ. Сам указатель является изменяемым.
во-вторых, char * const-это постоянный указатель на символ. Указатель не может измениться, символ, на который он указывает, может.
и тогда есть const char * const, где указатель и символ не могут измениться.
вот подробное объяснение с кодом
/*const char * p; char * const p; const char * const p;*/ // 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> /*int main() { const char * p; // value cannot be changed char z; //*p = 'c'; // this will not work p = &z; printf(" %c\n",*p); return 0; }*/ /*int main() { char * const p; // address cannot be changed char z; *p = 'c'; //p = &z; // this will not work printf(" %c\n",*p); return 0; }*/ /*int main() { const char * const p; // both address and value cannot be changed char z; *p = 'c'; // this will not work p = &z; // this will not work printf(" %c\n",*p); return 0; }*/
- постоянный указатель: постоянный указатель может указывать только на одну переменную соответствующего типа данных в ходе всей программы.мы можем изменить значение переменной, на которую указывает указатель. Инициализация должна быть выполнена во время самого объявления.
синтаксис:
datatype *const var;
char *constподпадает под этот случай./*program to illustrate the behaviour of constant pointer */ #include<stdio.h> int main(){ int a=10; int *const ptr=&a; *ptr=100;/* we can change the value of object but we cannot point it to another variable.suppose another variable int b=20; and ptr=&b; gives you error*/ printf("%d",*ptr); return 0; }
- указатель на значение const: в этом указатель может точка любого числа переменных соответствующего типа, но мы не можем изменить значение объекта, на который указывает указатель в определенное время.
синтаксис:
const datatype *varилиdatatype const *var
const char*подпадает под это дело./* program to illustrate the behavior of pointer to a constant*/ #include<stdio.h> int main(){ int a=10,b=20; int const *ptr=&a; printf("%d\n",*ptr); /* *ptr=100 is not possible i.e we cannot change the value of the object pointed by the pointer*/ ptr=&b; printf("%d",*ptr); /*we can point it to another object*/ return 0; }
char * const и const char *?
- указывая на постоянное значение
const char * p;// значение не может быть изменено
- постоянный указатель на значение
char * const p;/ / адрес изменить нельзя
- постоянный указатель на постоянное значение
const char * const p;/ / оба не могут быть изменены.
The
constмодификатор применяется к термину непосредственно слева от него. Единственное исключение - когда слева от него ничего нет, тогда он применяется к тому, что находится непосредственно справа.это все эквивалентные способы сказать "постоянный указатель на константу
char":
const char * constconst char const *char const * constchar const const *
два правила
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.например
char const *. This is a pointer points to a constant char.char * const. This is a constant pointer points to a char.
Я хотел бы отметить, что использование
int const *(илиconst int *) не о указателе, указывающем наconst intпеременная, но эта переменнаяconstдля этого конкретного указателя.например:
int var = 10; int const * _p = &var;код выше компилируется отлично.
_pточкиconstпеременной, хотяvarсам по себе не является постоянным.
// 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= &ccs; // Good char const **ccss1= &csc; // Bad - warning: initialization from incompatible pointer type char * const *cscs= &csc; // Good char * const *cscs1= &ccs; // Bad - warning: initialization from incompatible pointer type char ** const cssc= &pca1; // Good char ** const cssc1= &ccs; // Bad - warning: initialization from incompatible pointer type char ** const cssc2= &csc; // 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’ }
Comments