Answers:
不同的是,const char *
是一个指针指向一个const char
,而char * const
是一个常量指针到char
。
首先,指向的值不能更改,但指针可以更改。第二,指向的值可以更改,但指针不能更改(类似于引用)。
还有一个
const char * const
这是指向常量char的常量指针(因此不能更改任何内容)。
注意:
以下两种形式是等效的:
const char *
和
char const *
确切的原因在C ++标准中进行了描述,但重要的是要注意并避免造成混淆。我知道一些喜欢的编码标准:
char const
过度
const char
(使用或不使用指针),以便const
元素的位置与使用指针相同const
。
const int *foo,*bar;
会声明foo
和bar
都为int const *
,但int const *foo, *bar
会声明foo
为int const *
和bar
都为int *
。我认为typedef int * intptr; const intptr foo,bar;
将两个变量都声明为int * const
;我不知道使用组合声明创建没有typedef的该类型的两个变量的任何方法。
I believe const int *foo,*bar; would declare both foo and bar to be int const *
:是的。but int const *foo, *bar would declare foo to be a int const * and bar to be int *
:不!这将与前面的情况完全相同。(请参阅ideone.com/RsaB7n,在其中foo和bar都得到相同的错误)。I think typedef int * intptr; const intptr foo,bar; would declare both variables to be int * const
:是的。I don't know any way to use a combined declaration to create two variables of that type without a typedef
:嗯int *const foo, *const bar;
。C声明
int const *foo, *volatile bar
办bar
?使其无论const
和volatile
?我想念Pascal对声明的变量名称及其类型的干净分隔(指向整数指针数组的指针将是var foo: ^Array[3..4] of ^Integer
;`。我认为这是C中一些有趣的嵌套括号内的东西。)
int const *foo, *volatile bar
”中,类型部分是int const
(在之前停止*
),声明符是*foo
(表达式*foo
将表示int const
)和*volatile bar
;从右到左读取(cv-qualifiers的好规则),foo
是指向const int 的指针,并且bar
是指向const int(指针本身是volatile,指向的int被[访问为] const)。
[3..4]
语法,所以我们需要10个元素的数组)int *(*foo)[10];
。它镜像了它(未来)用作表达式的用法:(*(*foo)[i]
具有i
整数,[0, 10)
即ie [0, 9]
)将首先取消引用foo
以获取数组,然后访问索引处的元素i
(因为后缀[]
绑定比prefix紧密*
),然后取消引用该元素,最后产生一个int
(请参阅ideone.com/jgjIjR)。但这typedef
使它变得更容易(请参见ideone.com/O3wb7d)。
为避免混淆,请始终附加 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;
p
与类型无关:(const int *const)
。无论是好是坏(如果您要我问更糟),C和C ++中的const限定词都应该是postfix:cf const member function void foo(int a) const;
。声明的可能性const int
是例外,而不是规则。
const * char
是无效的C代码,没有意义。也许您是想问a const char *
和a 之间的差异char const *
,或者a const char *
和a 之间的差异char * const
?
经验法则:从右到左阅读定义!
const int *foo;
表示“ foo
指向(*
)指向int
不能更改的(const
)”。
对程序员来说,这意味着“我不会更改所指向的值foo
”。
*foo = 123;
否则foo[0] = 123;
将无效。foo = &bar;
被允许。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 * x这里X基本上是一个指向常量值的字符指针
char * const x是指常量的字符指针,但是它指向的位置可以更改。
const char * const x是1和2的组合,表示它是指向常量值的常量字符指针。
const * char x将导致编译器错误。它不能被声明。
char const * x等于点1。
经验法则是,如果const是var name,则指针将是恒定的,但是可以更改指向的位置,否则指针将指向恒定的位置,而指针可以指向另一个位置,但是指向的内容不能更改。
许多答案提供了特定的技术,经验法则等,以了解此变量声明的特定实例。但是有一种通用的技术可以理解任何声明:
顺时针/螺旋法则
一个)
const char *a;
按照顺时针/螺旋规则a
,指向恒定字符的指针。这意味着字符是常量,但指针可以更改。即a = "other string";
很好,但a[2] = 'c';
将无法编译
B)
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;
}*/
// 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’
}
句法:
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 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;
//两者都无法更改。
我想指出的是,int const *
(或 const int *
)与指向const int
变量的指针无关,而是该变量const
用于该特定指针。
例如:
int var = 10;
int const * _p = &var;
上面的代码可以完美地编译。_p
指向const
变量,尽管var
它本身不是常数。