C99:“int const * ptr”是什么意思?

时间:2013-08-12 09:55:06

标签: c pointers constants c99

我正在查看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

3 个答案:

答案 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”表示只能变量值本身(指针)不能更改。

这在您引用的文字中有说明,但是更为复杂。

尝试做一些作业,看看有什么错误,你会明白的。