const规则:允许什么,不是什么?

时间:2014-01-29 19:27:04

标签: c

我发现c中的const规则非常令人困惑。我想知道在处理const / const指针时是否有已知的规则或方法来了解允许的内容。

我会举一个例子:

不允许:

const int b=3;

int * const a=&b;

允许:

int b=3;

int * const a=&b;

如果编译包含const的代码,编译之前是否需要了解规则?我要做的一件事是 - 我想知道这是不是一个规则 - 每次你用const写一行时,总是必须在它之后进行初始化吗?我知道const可以/不能保留的内容有一些规则。

3 个答案:

答案 0 :(得分:2)

你的问题本身不是const本身,而是因为无法理解变量的含义。

将某些内容声明为const表示该值不会更改。所以:

const int b=3;

现在b拥有3并且您无法将其他内容分配给它,因为它是常量。对于指针也是如此:

int b=3;
int * const a=&b;

指针a现在指向b的地址,您现在无法分配不同的地址。原因如下:

const int b=3;
int * const a=&b;

不起作用是因为a是指向(非常数)int的常量指针。但是,您尝试为a分配常量int的值。所以编译器说“不”。

const int b=3;
const int * a=&b;

此更改现在允许它工作,因为a是指向constant-int的指针,这是b的指针,因此可以进行赋值。如果您希望ab都保持不变,则需要设置第二行:

const int * const a=&b;

您遇到了spiral rule的问题。

答案 1 :(得分:1)

第一个例子:

const int b=3;
// int * const a=&b; ERROR: cannot cast "const int *" to "int *".
const int *const a = &b;

你必须打开声明。

  • 类型int *const是一个常量指针,指向可变int
  • 类型const int *是指向常量int的可变指针。
  • 类型const int *const是指向常量int的常量指针。

如果赋值的左侧是常量(我的意思是“具有const限定符的类型”,则无法指定)。所以,

int *x = ...;
x = ...; // ok, RHS must be int *
*x = ...; // ok, RHS must be int

int *const x = ...;
x = ...; // error
*x = ...; // ok, RHS must be int

const int *x = ...;
x = ...; // ok, RHS may be int * or const int *
*x = ...; // error

const int *const x = ...;
x = ...; // error
*x = ...; // error

答案 2 :(得分:1)

基本规则是:

  • 可以添加const(在投射或转换时)。
  • 可以删除const ,如果它是稍后添加的const,而不是最初定义对象的const

示例:

int a = 3;
const int b = 4;

// Okay, adds const (says the int is const).
const int *p0 = (const int *) &a;

// Okay, adds const (says the pointer to the int is const).
int * const p1 = (int * const) &a;

// Okay, removes an added const.
int *p2 = (int *) p0;

// Not okay, removes a defined const.
int *p3 = (int *) &b;