const与非const之间,相互赋值时,如果使用不当,可能造成一些问题。 非指针类型 非指针类型 const int c_A = 10; int b = 20; b = c_A ; // 正确 c_A = b; // Error! 原因: 关于这个问题,网上有说”非const变量赋给const变量,是非法的“。请不要陷入这种容易混乱的逻辑。上述情况,比较正确的解释。const int 在初始化之后,是不能再改变的。且const int 必须在声明时就赋值。 // Error const int c_A; c_A = 10; 指针类型 const int* c_PtrA = new int(10); int * ptrB= new int(10); c_PtrA = ptrB; // 没问题 ptrB = c_PtrA; // 编译报错 不能从 const int* 转换程 int* // 下面这种情况不会报错,但可能造成程序崩溃 ptrB = (int*)c_PtrA; // .... *ptrB = 20; // 此处修改了b和a共同指向的地址的内容,程序崩溃 原因: const int * 表示,指向常量int 类型的指针,即指向的这块内存的内容,不可以修改。(但指针本身可以修改)。int * 表示,指向非常量int类型的指针,指针这块内存的内容可修改,指针本身可修改。const int* 已经限制此地址内容,不可修改。这时,却让 int * 指针指向这块地址,而使用 int * 指针,表示此地址内容可修改。那么到底可不可以改?接上,因此逻辑冲突,编译器报错。 // 正确 const int * c_A; // ... c_A = someAddress; 因此,对于非指针类型的const,可以理解为使用"const”,就是常量了。什么是常量?10,20,"linduo"等都是常量。 int a、char s等都是变量。对于指针类型,当然有常量指针和指针常量的区别。可以理解为,使用"const",是用来限制,指针本身或指针指向内容,可不可以修改。