两者之间有何不同:
char * const
而且
const char *
两者之间有何不同:
char * const
而且
const char *
const char *
是指向const char
的指针,而char * const
是指向char
的常量指针。
第一种情况下,指针所指向的值不能被更改,但可以改变指针本身。第二种情况下,指针所指向的值可以被更改,但指针本身无法修改(类似于引用)。
还有一个
const char * const
这是一个指向常量字符的常量指针(因此它所指向的任何内容均不可更改)。
注意:
以下两种形式是等效的:
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。 - supercatint const *foo, *volatile bar
对 bar
会产生什么影响?使它既成为 const
又成为 volatile
吗?我想念 Pascal 中声明变量名和类型之间的清晰分离(指向整数指针数组的指针将是 var foo: ^Array[3..4] of ^Integer
; 在 C 中,这将是一些有趣的嵌套括号的事情,我想。 - supercatint const *foo, *volatile bar
"中,类型部分是int const
(在*
之前停止),而声明符包括*foo
(表达式*foo
表示一个int const
类型)和*volatile bar
。按照从右到左的顺序来阅读(对于_限定词_,这是个好规则),foo
是一个指向常量整数的指针,而bar
是一个指向常量整数的_volatile_指针(指针本身是_volatile_的,所指向的整数是[作为]常量访问的)。 - gx_[3..4]
语法,所以我们来看一个有 10 个元素的数组): int *(*foo)[10];
。它反映了它(未来)作为表达式的使用方式:*(*foo)[i]
(其中 i
是范围为 [0, 10)
即 [0, 9]
的整数)将首先对 foo
进行反引用以访问数组,然后访问索引 i
处的元素(因为后缀 []
比前缀 *
绑定更紧密),然后再对此元素进行反引用,最终得到一个 int
(请参见 http://ideone.com/jgjIjR)。但是 typedef
使其变得更容易(请参见 http://ideone.com/O3wb7d)。 - gx_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限定符都是后缀,例如const成员函数void foo(int a) const;
。声明const int
的可能性是例外而不是规则。 - diapirconst
始终修改它前面的内容(在它左侧),除非它是类型声明中的第一项,那么它将修改它后面的内容(在它右侧)。
所以这两个是相同的:
int const *i1;
const int *i2;
它们定义了指向 const int
的指针。你可以改变 i1
和 i2
指向的位置,但是不能改变它们所指向的值。
这样做:
int *const i3 = (int*) 0x12345678;
定义了一个指向整数的const
指针,并将其初始化为指向内存位置12345678。你可以更改地址为12345678的int
值,但是无法更改i3
指向的地址。
经验法则:从右往左读定义!
const int *foo;
表示 "foo
指向(*
)一个不能改变的 int
值"。
对程序员来说,这意味着 "我不会改变 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
值"。
对程序员来说,这意味着 "我不会改变 foo
所指向的值,也不会改变 foo
引用的内存地址"。
*foo = 123;
或 foo[0] = 123;
将是无效的。foo = &bar;
将是无效的。const char*
是指向常量字符的指针
char* const
是指向字符的常量指针
const char* const
是指向常量字符的常量指针
const * char
是无效的C代码且毫无意义。也许你想问的是const char *
和char const *
之间的区别,或者可能是const char *
和char * const
之间的区别?
const char* x:这里的X基本上是字符指针,指向一个常量值。
char* const x:是指指向一个常量的字符指针,但它所指的位置可以改变。
const char* const x:结合了1和2的含义,表示一个指向常量值的常量字符指针。
const *char x:会导致编译错误,不能声明。
char const * x:与第一条相等。
经验法则是,如果const
与变量名一起使用,则指针将是常量,但指向的位置可以更改;否则指针将指向常量位置,指针可以指向另一个位置,但指向的位置内容不能更改。
另一个规则是检查 const 的位置:
顺时针/螺旋规则
A)
const char *a;
a
指向常量字符。这意味着字符是常量,但指针可以改变。即a = "other string";
是可以的,但a[2] = 'c';
将无法编译。char * const a;
a
是指向字符的const指针。也就是说,你可以执行a[2] = 'c';
,但不能执行a = "other string";
。const char * mychar
并且
char * const mychar