文章目录
目录
文章目录
一、const关键字
1.const简介
2.const的使用
二、const与指针的关系
1.c语言与c++中const的区别
2.const与指针的关系
一、const关键字
1.const简介
当const修饰一个变量时,该变量的数据只能被访问不能被修改,也就是"只读",编译器会把const修饰类型的对象放入只读内存中
2.const的使用
代码示例:
const int n = 10;
int b = 10;
const int* p = &b;
错误示例:
const int n = 10;
n = 20;//n被const修饰,不能改变其值,编译不通过
int b = 10;
const int* p = &b;
*p = 100;//error
二、const与指针的关系
1.c语言与c++中const的区别
在C语言中,const以变量为主,而在C++中,const以常性为主。下面通过一些示例来理解二者区别。
举例1:
const int n = 10;
int ar[n]{1,2,3}; // C语言中编译不通过,而C++编译通过
原因:在C语言中,n是变量属性,而数组定义时,[ ]内必须为整型常量,因此报错,而在C++的编译过程中,会在将n替换为字面常量10,所以在C++中,int ar[n]{1,2,3}相当于 int ar[10]{1,2,3},故编译通过。
举例2:
int main()
{
const int a = 10;
int b = 0;
int* ip = (int*)&a;
*ip = 100;
b = a;
printf("a = %d b = %d *ip = %dn", a, b, *ip);
return 0;
}
上面这段代码按C语言编译结果:a=100 b=100 *ip=100,按C++方式编译结果:a=10 b=10 *ip=100,这是因为在C语言中是从a空间中取值,而C++中则是编译时将a替换为字面常量10。
这一点我们可以从反汇编代码中看出
C++中查看反汇编
2.const与指针的关系
(1)const 修饰离它距离最近的变量
代码示例:
int main()
{
int a = 10, b = 20;
int* p1 = &a;
*p1 = 100;//1 编译通过
p1 = &b;//2 编译通过
const int* p2 = &a;
*p2 = 100;//3 编译不通过
p2 = &b;//4 编译通过
int* const p3 = &a;
*p3 = 100;//5 编译通过
p3 = &b;//6 不通过
const int* const p4 = &a;
*p4 = 100;//7 不通过
p4 = &b;//8 不通过
return 0;
}
以上代码中,没有const修饰,指针的值能够进行改变,1,2都能编译通过。
const int* p2中,const修饰的是*p2,所以不能通过修改*p2来改变a的值,但可以改变p2的指向。
int* const p3中const修饰的是p3,可以通过修改*p3来修改a的值,但是p3指向不能改变。
const int* const p4 二者都被const修饰,均不可改变。
(注意:指针包含两个部分的值,一个是指针自身的值(指向谁的地址),一个是所指向的变量的值)
(2)遵循赋值兼容性原则
能力强的能够赋值给能力弱的
代码示例:
int main()
{
int a = 10, b = 20;
int* p = &a;
int* s1 = p;// √
const int* s2 = p; // √
int* const p3 = p;// √
const int* const s4 = p; //√
return 0;
}
以上代码中,p没有const修饰,p的指向可以改变,也可以通过改变*p来改变a的值,*s2可以改变指向,但不能通过*s2的改变来改变a的值,所以相对于s2,p的能力较强,因此编译能够通过。依次类推,如此方法上述判断均可通过。
若用const修饰*p(const int*p),如下:
int a = 10, b = 20;
const int* p = &a;
int* s1 = p;// ×
const int* s2 = p; // √
int* const p3 = p; // ×
const int* const s4 = p; // √
若const修饰p(int* const p),都可以通过。



