[C++] Const详解
/**************************************************************** 初级理解: 1.const是定义常量 ==》const意味着只读 2.以下const的变量必须初始化! ***************************************************************/ /*---------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------- 原因分析: const在C语言中是以分配内存的形式出现的!这样的话,就容易让指针有机可乘 C语言中const变量是只读变量,有自己的存储空间 const在C++中并不分配内存,而是放在了一个符号表里,表目是:key value ->编译过程中若发现使用常量则直接以符号表中的值替换 ->编译过程中若发现对const使用了 extern 或者 &操作符,
则给对应的常量(如下面的符号表里a对应的常量10)分配内存空间(兼容C),然后将指针变量p指向这个内存空间 C++中的const常量 A.可能不分配存储空间 ... B.也可能分配存储空间 1).当const常量为全局,并且需要在其它文件中使用 2).当使用&操作符取const常量的地址
Const和define的区别 C.1 const常量是由编译器处理的,提供类型检查和作用域检查
C.2 宏定义由预处理器处理,单纯的文本替换
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ #include <iostream> #include <cstdio> #include <cstdlib> extern const int test = 11;//test如果要在别的文件共用,则不管是声明 还是 定义 都必须添加 extern struct Teacher{ char name[64]; int age; }; int main(void) { // const int a; //等价于 int const a; 代表一个常整形数a // // const int * c;//c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改) // // int * const d;// d是常指针(指针变量不能被修改,但是它所指向内存空间可以被修改) // // const int * const e;//e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改) const int a = 10; int *p = (int*)&a;//必须人为的将const int* 转化为 int* //将符号表里a对应的10取出来建立一个独立的内存空间,并将p指向这个内存空间 printf("original a = %d\r\n", a); *p = 11; printf("modify a = %d\r\n", a); //实际打印的是符号表里的a printf("modify *p = %d\r\n", *p); printf("同样的代码如果放在C编译器里,则为 10 11 和 11 .\r\n"); return 0; } /*———————————————————————————————————————————————— Const的两个应用 ————————————————————————————————————————————————*/ /*指针变量名->成员名 == (*指针变量名).成员名 */ int fun(const Teacher *p) { //Const修改形参的时候,在利用形参不能修改指针所向的内存空间,减少bug // p->age = 10;//【err】 // p = NULL;//【ok】 } int func(Teacher * const p) { // Const修改形参的时候,在利用形参不能修改指针本身,但可以修改所指向的内存 // p->age = 10;//【ok】 // p = 0; //【err】 }