c和指针——指针和const
常量
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; //正确,同第七行