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;	//正确,同第七行
posted @ 2011-12-04 11:58  martin@dlut  阅读(910)  评论(0编辑  收藏  举报