我发现c中的const
规则非常令人困惑。我想知道在处理const
/ const
指针时是否有已知的规则或方法来了解允许的内容。
我会举一个例子:
不允许:
const int b=3;
int * const a=&b;
允许:
int b=3;
int * const a=&b;
如果编译包含const
的代码,编译之前是否需要了解规则?我要做的一件事是 - 我想知道这是不是一个规则 - 每次你用const
写一行时,总是必须在它之后进行初始化吗?我知道const
可以/不能保留的内容有一些规则。
答案 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
的指针,因此可以进行赋值。如果您希望a
和b
都保持不变,则需要设置第二行:
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;