C语言中const是一个伪常量,可以通过指针间接赋值改变,在C++中const得到加强,定义的是真常量。
const int a = 3;const int b = 4;int array[a + b] = { 0 };以上语句在C语言报错,在C++中通过,即可说明真伪常量的区别。
定义:const type name=value;注意:初始化和定义一起
C语言通过指针改变const值:
void test5()
{
const int a ;
//int const b; //const int , int const 是等价的
int *p = (int*)&a;
*p = 20;//C语言中可以通过指针的间接赋值改变const变量
printf("a = %d\n", a);
}
在C++中指针无法这样的原因是,C++没有像C语言一样给const常量分配内存单元,const常量被放在一个只读的符号表中
例如定义一些const常量:const int a=10; int const b=20;
name | value |
---|---|
a | 10 |
b | 20 |
C++中使用如上指针变量间接赋值时,指针p指向的是编译器在栈中找的一个临时存储单元(即将临时空间的地址赋给p),因此在C++中,执行上述代码后,a的值没有改变。
不管是在C还是C++中int const b; const int b 是等价的,然而const int *a和int *const a却是有区别的。
const int *a —— 一个指向常整形数的指针(所指向的内存数据不能被修改,但是本⾝(即地址)可以修改)
int *const a —— 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
const int* const a —— 一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
用几个代码区分他们:
struct student
{
int id;
char name[64];
};
void change_stu(struct student *s)
{
s ->id = 10;//常规指针变量
}
void change_stu2(const struct student *s)
{
s->id=10; //此时s所指向的区域是一个常量 不能够被修改,报错
struct student s2;//可以创建一个新的变量取其地址赋给s,编译通过,说明s本身是可以改变的
s = &s2;
cout << s << endl;
}
void change_stu3(struct student *const s)
{
s->id = 10;//编译通过,s是一个常量指针,本身不可变,但指向的区域是可变的
struct student s2;//再次报错,因为s是一个常量指针
s = &s2;
}
void change_stu4(const struct student *const s)
{
s->id = 10;
struct student s2;
s = &s2; //以上都是错的,s是一个指向常量的常量指针。
}
再来谈谈,const和#define的区别吧
1.编译阶段不一样:const是编译器处理,define是预处理器
2.const划分作用域,define是全局的
建议使用const