简单聊一下const
问题索引:
1.为什么要存在这种东西?
2.它有什么样的作用?
3.与define 有什么联系?
4.C与C++中的const有什么区别?
5. C++ 11 中又有了些什么新的东西?
解:
1.为什么要存在这种东西?就是为了避免程序员在编程时,手残修改关键部分的值(其实想一想内核为什么会分内核态和用户态,类中为什么要有public和private也就明白了)
2.它有什么样的作用?其实说的简单点就是保护被修饰的东西,防止意外的修改
3.与define 有什么联系?他们的底层实现是如何的?其实这是一个最不好回答的问题。我就简单的从内存方面来叙述一下
联系:
define – 不分配内存,给出的是立即数,只是简单的替换。有多少次使用就进行多少次拷贝替换,在内存中会有多个拷贝,消耗内存大
const – 在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝
4.C与C++中的const有什么区别?
C中的const
1.C中的const修饰的是只读变量,还是变量,只是不可写
2.有两种改变变量的值:(1)直接赋值的形式(2)通过指针
const m= 10; //m 的值不能在程序中被修改(但可以通过指针改变它)
const char *p; //*p不能变,即通过指针无法改变变量的值
char const *p; //同上,只是形式不同而已
char *const p; //p不能变,即**指针p的指向**被固定,也就是说,指针这个变量只能存储指向变量的值。
const char *const p; //*p 和p同时不能变
举例验证:
1.代码:
#include<stdio.h>
int main(void)
{
/*const 19; //修饰了常量*/
const int m = 10;
// m= 11; //1.c:13:6: 错误:向只读变量‘m’赋值
int *p_m = &m ; //1.c:14:16: 警告:initialization discards ‘const’ qualifier from pointer target type
*p_m = 999999;
printf("m == %d \n",m); //通过指针就可以改变它的值
return 0;
}
2.代码:
#include<stdio.h>
int main(void)
{
/*int m= 10;
const int *p ;
p=&m;
// *p= 1111; //1.c:14:7: 错误:向只读位置‘*p’赋值
m= 22222; //直接赋值的形式可以改变它的值
printf("const int *p的情况: m == %d \n",m);*/
int n = 50;
int temp = 0;
int *const p=&n ;
p=&temp ; //1.c:26:6: 错误:向只读变量‘p’赋值
return 0;
}