我正在查看C99规范(N1256.pdf),其中写道(第11506页):
const int *ptr_to_constant;
int *const constant_ptr;
“ptr_to_constant指向的任何对象的内容不能通过该指针修改,但ptr_to_constant本身可能会更改为指向另一个对象。同样,constant_ptr指向的int的内容可能会被修改,但是constant_ptr本身应始终指向同一地点。“ (6.7.5.1指针声明符)
现在我从前面的内容中读到以下两个陈述会产生相同的行为。
int *const constant_ptr; /* This form is mentioned in the standard */
int const *constant_ptr; /* This form is NOT mentioned in the standard */
我想知道第二种形式是正确还是只是一种扩展。
提前致谢, -S
答案 0 :(得分:5)
实际上int const *constant_ptr;
与const int *ptr_to_constant;
相同。 const
关键字影响左侧的元素,如果没有,则会影响右侧的元素。
int const *constant_ptr;
,此处const
左侧的元素为int
。
const int *ptr_to_constant;
,此处const
左侧没有元素,因此它适用于右侧的元素,即int
。
const int *ptr_to_constant;
这里,只有指针指向的值是常量。
int *const constant_ptr;
这里,指针是常量。
int const *constant_ptr;
这里,只有指针指向的值是常量。
int const * const constant_ptr_to_constant;
这里,指针和它指向的值是常量。
修改强>
int const *constant_ptr;
,您调用指针constant_ptr
,但如果我保留您的名称方案,则应将其称为ptr_to_constant
。
答案 1 :(得分:2)
如果`const'关键字位于星号的左侧,并且是唯一的关键字 在声明中,然后指针指向的对象是常量,但是, 指针本身是可变的。
int a = 1;
int b = 2;
const int *p1;
p1 = &a;
p1 = &b; // Can be pointed to another variable
*p1 = 23; // <----- NOT ALLOWED
如果`const'关键字在星号的右边,并且是唯一的关键字 在声明中,那么指针指向的对象是可变的,但是指针 是不变的;即,指针一旦初始化,将始终指向同一对象 通过它的范围。
int a = 1;
int b = 2;
int * const p2 = &a;
*p2 = 7; // <----- Can assign a value via indirection
p2 = &b; // <----- NOT ALLOWED
如果`const'关键字位于星号的两边,则指针都是 而尖头的物体是不变的。
int a = 1;
int b = 2;
const int * const p3 = &b;
*p3 = 42; // <------ NOT ALLOWED
p3 = &a; // <------ NOT ALLOWED
答案 2 :(得分:1)
“const”关键字在这两种情况下修改了不同的东西。
“const int *”表示它是无法更改的“int”部分。
“int * const”表示只能变量值本身(指针)不能更改。
这在您引用的文字中有说明,但是更为复杂。
尝试做一些作业,看看有什么错误,你会明白的。