常量
const修饰符修饰一个变量,则此变量的值在初始化之后无法改变。声明的变量可以用来声明数组;
定义常量建议用#define,在预处理时进行替换。
在遇到指针时,const与指针结合形成不同的组合,对于const和指针概念不清晰,很容易犯错误。
先看下面的代码:
1: int *a; //指向整形变量的指针
2: const int *c; //指向不可修改的整形变量的指针
3: int * const d; //指向整形变量的不可修改的指针
4: int const * const e; //指向不可修改的整形变量的不可修改的指针
在指针变量声明时,不同类型间的数据是不能相互赋值的,除非符合一定条件,编译器进行自动转换。
这个条件是
从没有const的一端做右值赋值给有const的一端。
先看下面代码:
1: char ** pointera;
2: const char ** pointerb;
3: char * const * pointerc; //这个指针可以用pointera来初始化;
4: char ** const pointer; //这个指针可以用pointera来初始化;
根据编译器的提示,可以作如下的理解:
自动转换只会发生在指针有const或者指针指向的内容有const.
而对于指针指向的是另一个指针的情况,由于指针指向的内容的类型不同,编译器是不会进行自动转换的。
例如:
1: double *a;
2: int *b;
3: a = b; //非法,指针类型不同
4:
5: const int *c =b; //指针指向内容多了const限制,正确
6: int * const d =b; //指针多了const限制,正确
7: const int * const e=b; //指针和之后怎指向内容多了const限制,正确
8:
9: char ** pointer ;
10: const char **pointer1 = pointer; //错误,pointer1指向const char *
11: //而pointer指向char*,类型不同。错误同第三行
12: char * const *pointer2 = pointer; //正确,同第五行
13: char ** const pointer3 = pointer; //正确,同第六行
14: char * const * const pointer4 = pointer; //正确,同第七行