
来自cppreference.com
C类型系统中的每个独立类型都有几种合格的类型const类型,分别对应于指向对象的const,volatile和strict限定符中的一个,两个或全部三个. 本页描述const限定词的作用. 编译器可以将用const限定类型声明的对象放入只读内存,如果程序从不使用const对象的地址,则它可能根本不存储它. const语义仅适用于左值表达式;只要在不需要左值的上下文中使用const左值表达式,它们的const限定符就会丢失(请注意,如果存在volatile限定符就不会丢失). 是指const限定类型对象的左值表达式,左值表达式是指具有至少一个const限定类型成员(包括由集合或联合递归包含的成员)的结构或联合,它不是可修改的左值. 具体来说,它们是不可分配的:
const int n = 1; // const 类型对象
n = 2; // 错误: n 的类型为 const 限定
int x = 2; // 无限定类型对下
const int* p = &x;
*p = 3; // 错误:左值 *p 的类型为 const 限定
struct int a; const int b; s1 = .b=1, s2 = .b=2;
s1 = s2; // 错误: s1 的类型无限定,但它有 const 成员
具有const限定结构或联合类型的成员,获取其所属类型的限定版本(当使用. 运算符或->运算符访问时).

struct s int i; const int ci; s; // s.i 的类型为 int , s.ci 的类型为 const int const struct s cs; // cs.i 和 cs.ci 的类型都是 const int
如果使用const类型限定符声明数组类型(通过使用typedef),则该数组类型不是const限定符,但其元素类型是const类型限定符. 如果使用const类型限定符声明函数类型(通过使用typedef),则行为是不确定的.
typedef int A23; const A a = 4, 5, 6, 7, 8, 9; // const int 的数组的数组 int* pi = a0; // 错误: a[0] 拥有 const int* 类型
限定常量的

复合文字不必引用不同的对象. 它们可以与其他具有重叠表示形式的复合文字和字符串文字一起存储.
const int* p1 = const int1, 2, 3; const int* p2 = const int2, 3, 4; // p2 的值可等于 p1+1 _Bool b = "foobar" + 3 == const char"bar"; // b 的值可为 1
指向非const类型的指针可以隐式转换为指向相同或类型的const限定版本的指针. 逆向转换可以通过转换表达式来完成.
int* p = 0; const int* cp = p; // OK :添加限定符( int 到 const int ) p = cp; // 错误:舍弃限定符( const int 到 int ) p = int*cp; // OK :转型

请注意,指向T指针的指针不能转换为指向const T指针的指针. 为了使两种类型兼容const类型,它们的资格必须相等.
char *p = 0; const char **cpp = &p; // 错误: char* 与 const char* 不是兼容类型 char * const * = &p; // OK :添加限定符( char * 到 char *const )
任何尝试修改const限定类型的对象的行为都会导致不确定的行为.
const int n = 1; // const 限定类型对象 int* p = int*&n; *p = 2; // 未定义行为
在函数声明中,关键字const可能出现在用于声明数组类型函数参数的方括号中. 它定义了将数组类型转换为的指针类型.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-179745-1.html
马云