1. const的作用

我们可以先看一段代码,看一下const的作用

  1. //代码4.1
  2. #include <iostream>
  3. int main()
  4. {
  5. using namespace std;
  6. int i = 20;
  7. i = 40;
  8. cout << i <<endl;
  9. return 0;
  10. }
  11. //代码4.2
  12. #include <iostream>
  13. int main()
  14. {
  15. using namespace std;
  16. const int i = 20;
  17. i = 40;
  18. cout << i <<endl;
  19. return 0;
  20. }

注意到代码4.2中声明整型变量 i 时添加了const,导致编译失败,程序无法运行,如下图所示
image.png 有了 const 修饰的 i 我们不称它为变量,而称符号常量,代表着 20 这 个数。这就是 const 的作用。i 是不能在它处重新赋新值了。

  1. const int i = 20;
  2. int const i = 20;//两者效果一样
  3. int const *pi;
  4. const int *pi;//两者效果一样
  1. const int *pi的语义 ```cpp //代码4.3

    include

int main() { using namespace std; int i1 = 30; int i2 = 40; int const pi = &i1;//const int pi 一样正确 pi = &i2; i2 = 70; cout << i2 <<endl; }

  1. 这段代码输出结果是70;<br />注意第10行代码,pi 可以在任意时候重新赋值一个新内存地址;<br />但第11行代码,i2 = 70 ,这里我们不能用*pi = 70 代替,因为关键字const的位置,表明*pi是个常量,而pi是个指针变量,可以继续赋值或者更改。
  2. 3. int *const pi 的语义
  3. ```cpp
  4. 代码4.4
  5. #include <iostream>
  6. int main()
  7. {
  8. using namespace std;
  9. int i1 = 30;
  10. int i2 = 40;
  11. int *const pi = &i1;
  12. //pi = &i2;此时pi是一个常量,无法进行修改或者赋值,因此这行被注释掉
  13. *pi = 80;//类比代码4.3
  14. cout << i1 <<endl;
  15. }

输出结果是80;
pi 值是不能重新赋值修改了, 它只能永远指向初始化时的内存地址了 ;
这次的 pi 是一个指向 int 变量类型数据的指针常量。

  1. 补充三种情况

情况一:int *pi 指针指向 const int i 常量的情况
我们来看第一段代码

//代码4.5
#include <iostream>

int main()
{
    using namespace std;
    const int i1 = 30;
    int *pi;
    pi = &i1;
   // pi = (int *) &i1;
    //*pi = 80;
    //cout << i1 <<endl;
}

这段代码是无法编译成功的;
继续看第二段代码,我们把第9行代码注释掉,使用第10行 int类型强制转换,可以通过编译,尝试通过*pi修改i1的值

//代码4.6
#include <iostream>

int main()
{
    using namespace std;
    const int i1 = 30;
    int *pi;
    //pi = &i1;
    pi = (int *) &i1;
    *pi = 80;
    cout << i1 <<endl;
}

下面是程序运行结果,发现并没有修改i1的值
image.png 情况二:const int *pi 指针指向 const int i1 的情况
先看一个代码片段

//代码4.7
#include <iostream>

int main()
{
    using namespace std;
    const int i1=40;
    const int * pi;
    pi = &i1;//这样赋值没问题的
}

显然,无论怎样我们都不能修改i1的值
情况三:用 const int *const pi 声明的指针

代码4.8
int i; 
const int * const pi=&i;

这类似在套娃(
显然,*pi和pi都被限制,无法通过两者修改i的值