What is the difference between char * const and const char *?
有什么区别:
1 | char * const |
和
1 | const char * |
区别在于
第一,被指向的值不能更改,但指针可以更改。第二,被指向的值可以更改,但指针不能更改(类似于引用)。
还有一个
1 | const char * const |
它是指向常量char的常量指针(因此不能更改任何内容)。
注:
以下两种形式是等效的:
1 | const char * |
和
1 | char const * |
在C++标准中描述了这一点的确切原因,但是注意并避免混淆是很重要的。我知道一些编码标准,它们更喜欢:
1 | char const |
结束
1 | const char |
(有指针或无指针)使
为避免混淆,请始终附加const限定符。
1 2 3 4 | 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; |
所以这两个是相同的:
1 2 | int const *i1; const int *i2; |
它们定义指向
这是:
1 | int *const i3 = (int*) 0x12345678; |
定义指向整数的
- 什么是常量指针(与指向常量对象的指针相反)?
- C中的Const
- C++中const声明的区别
- C++常见问题
- 为什么要更改const char*变量的值?
1)const char*x这里x基本上是一个指向常量值的字符指针。
2)char*const x是指字符指针,它是常量,但它所指向的位置可以更改。
3)const char*const x是1和2的组合,表示它是指向常量值的常量字符指针。
4)const*char x将导致编译器错误。不能声明。
5)char const*x等于点1。
经验法则是,如果const具有var名称,那么指针将是常量,但指向位置可以更改,否则指针将指向常量位置,指针可以指向其他位置,但指向位置内容不能更改。
Thumb rule of thumb:read the definition from right to left!
法国电力公司
"
- 这将使人残疾。
- 允许的
法国电力公司
中文"
- 这是允许的。
- 将致残。
法国电力公司
《不能改变的》(EDOCX1,11)、《不能改变的》(EDOCX1,11)、《点》(EDOCX1,9)、《不能改变的》(EDOCX1,11)"。这意味着"我不会改变什么
- 这将使人残疾。
- 将致残。
第一个是语法错误。也许你的意思是
1 | const char * mychar |
和
1 | char * const mychar |
在这种情况下,第一个是指向无法更改的数据的指针,第二个是指向相同地址的指针。
另一个经验法则是检查const在哪里:
许多答案提供了具体的技术、雷管等,以了解变量宣言的这一具体实例。但是,有一种通用技术可以理解任何宣言:
Clockwise/Spiral Rule
(a)
1 | const char *a; |
按时钟/螺旋规则
(b)
1 | char * const a; |
按照规则,以一个字符为准。你可以做
我想指出,使用
For example:
1 2 | int var = 10; int const * _p = &var; |
这个密码是完美的。Itself isn't constant.
句法:
1 | datatype *const var; |
在这个案件下
ZZU1
句法:
或埃多克斯1
在这个案件下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /* 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 ",*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; } |
Const和Const Char*?
不能改变价值
地址无法更改
两者都不能改变。
修正案立即适用于第三方的左侧。这方面唯一的例外是,在没有任何东西属于它的左边时,它立即适用于它的权利。
这些是"恒定指针到恒定指针"的所有等效方式。
- 法国电力公司
- 法国电力公司
- 法国电力公司
char const const *
两条规则
E.G.
我想你的意思是常量char*和char*常量。
第一个常量char*是指向常量字符的指针。指针本身是可变的。
第二个,char*const是指向字符的常量指针。指针不能更改,它指向的字符可以。
还有常量char*const,指针和字符不能更改。
这是一个详细的解释和代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | /*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 ",*p); return 0; }*/ /*int main() { char * const p; // address cannot be changed char z; *p = 'c'; //p = &z; // this will not work printf(" %c ",*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 ",*p); return 0; }*/ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | // 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’ } |