如果const写在指针类型的左边(const 数据类型 * ), 那么意味着指向的内存空间中的值不能改变, 但是指针的指向可以改变
如果const写在指针的数据类型和*号之间(数据类型 const *), 那么意味着指向的内存空间中的值不能改变, 但是指针的指向可以改变
如果const写在指针的右边(数据类型 * const), 那么意味着指针的指向不可以改变, 但是指针指向的存储空间中的值可以改变
规律:
如果const写在指针变量名的旁边, 那么指针的指向不能变, 而指向的内存空间的值可以变
如果const写在数据类型的左边或者右边, 那么指针的指向可以改变, 但是指向的内存空间的值不能改变
int v1 = 2;
int v2 = 3;
int *a = &v1;
a = &v2;
int *const b = &v1;
const int *b2 = &v1;
*b = 3;
printf("%i", v1);
const对基本数据类型的作用, 可以让基本数据类型的变量变为常量
const有两种写法, 1.写在数据类型的左边, 2.写在数据类型的右边
// const int num = 10;
int const num = 10;
printf("num = %i\n", num);
//num = 55;
printf("num = %i\n", num);
const 有什么作用
- 可以定义const常量,具有不可变性
const int Max=100;
int Array[Max];
- 便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
void func(const int i) { .........}
可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!如1.中,如果想修改Max的内容,只需要:const int Max =you want;即可!
可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在 函数体内修改了i,编译器就会报错;
void func(const int i) {
i=10;
//error!
}
- 可以节省空间,避免不必要的内存分配。
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ...... double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI;
//再进行宏替换,又一次分配内存! const定义常量从汇编的角度来看,只是给出了对应的内存地址,
//而不是象#define一样给出的是立即数,
//所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存 中有若干个拷贝。
- 提高了效率。编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高