c和指针——指针和const

来源:互联网 发布:苹果6网络知识 编辑:程序博客网 时间:2024/05/22 09:51

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;//正确,同第七行
0 0