6 修饰指针(两种辨别方法)

1

const  int*p; //p可变,p指向的对象不可变

int const*p; // p可变,p指向的对象不可变

int*const p; //p不可变,p指向的对象可变

const int*const p;//指针p和p指向的对象都不可变

const离谁近就修饰谁。

Const int *p; //const修饰*p,p是指针,*p是指针指向的对象,不可变

int  const  *p;//const修饰*p,p是指针,*p是指针指向的对象,不可变

int* const p;//const修饰p,p不可变,p指向的对象可变

const  int * const p;//前一个const修饰*p,后一个const修饰p,指针p和p指向的对象

都不可变

2

int b = 500;

const int* a = &b;    [1]

int const *a = &b;   [2]

int* const a = &b;   [3]

const int* const a = &b; [4]

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;

如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

因此,

[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),

  这种情况下不允许对内容进行更改操作,如不能*a = 3;

[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;

[4]为指针本身和指向的内容均为常量。

7 const的使用节省空间,避免不必要的内存分配,同时提高效率

编译器通常不为普通const只读变量分配存储空间,而是将它们保存在符号表中,这使

得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。        例如:

              #define PI 3.14159         //常量宏

              const doulbe  Pi=3.14159;  //此时并未将Pi放入ROM中

              ......

              double i=Pi;               //此时为Pi分配内存,以后不再分配!

              double I=PI;               //编译期间进行宏替换,分配内存

              double j=Pi;               //没有内存分配

              double J=PI;               //再进行宏替换,又一次分配内存!

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。(此知识点需要进一步研究)