当前位置:   article > 正文

const与非const类型赋值问题_const指针赋值给非const

const指针赋值给非const
  • const与非const之间,相互赋值时,如果使用不当,可能造成一些问题。
非指针类型
  • 非指针类型
const int c_A = 10;
int b = 20;

b = c_A ; // 正确
c_A = b; // Error!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 原因:
  1. 关于这个问题,网上有说”非const变量赋给const变量,是非法的“。请不要陷入这种容易混乱的逻辑。
  2. 上述情况,比较正确的解释。const int 在初始化之后,是不能再改变的。且const int 必须在声明时就赋值。
// Error
const int c_A;
c_A = 10;
  • 1
  • 2
  • 3
指针类型
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共同指向的地址的内容,程序崩溃
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 原因:
  1. const int * 表示,指向常量int 类型的指针,即指向的这块内存的内容,不可以修改。(但指针本身可以修改)。
  2. int * 表示,指向非常量int类型的指针,指针这块内存的内容可修改,指针本身可修改。
  3. const int* 已经限制此地址内容,不可修改。这时,却让 int * 指针指向这块地址,而使用 int * 指针,表示此地址内容可修改。那么到底可不可以改?
  4. 接上,因此逻辑冲突,编译器报错。
// 正确
const int * c_A;
// ...
c_A = someAddress;
  • 1
  • 2
  • 3
  • 4
  • 因此,对于非指针类型的const,可以理解为使用"const”,就是常量了。什么是常量?10,20,"linduo"等都是常量。 int a、char s等都是变量。
  • 对于指针类型,当然有常量指针和指针常量的区别。可以理解为,使用"const",是用来限制,指针本身或指针指向内容,可不可以修改。
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号