2

我正在查看 C99 规范(N1256.pdf),它在(p.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

4

3 回答 3

5

其实int const *constant_ptr;是一样的const int *ptr_to_constant;。该const关键字影响左边的元素,如果没有,它会影响右边的元素。

int const *constant_ptr;,这里左边的元素constint

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

于 2013-08-12T10:37:40.010 回答
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
于 2013-08-12T11:29:19.660 回答
1

“const”关键字在这两种情况下修改了不同的东西。

“const int *”意味着它是“int”部分不能改变。

“int *const”意味着只有变量值本身(指针)不能改变。

这在您引用的文本中有所说明,但以更复杂的方式进行了说明。

试着做一些作业,看看有什么错误,你就会明白了。

于 2013-08-12T10:01:17.617 回答