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定义的常量在内存中有若干个拷贝。(此知识点需要进一步研究)