const int *pi与int *const pi 的区别

1.const的作用

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

//代码4.1
#include <iostream>

int main()
{
    using namespace std;
    int i = 20;
    i = 40;
    cout << i <<endl;
    return 0;
}

//代码4.2
#include <iostream>

int main()
{
    using namespace std;
    const int i = 20;
    i = 40;
    cout << i <<endl;
    return 0;
}

注意到代码4.2中声明整型变量i时添加了const,导致编译失败,程序无法运行,如下图所示

有了 const 修饰的 i 我们不称它为变量,而称符号常量,代表着 20 这 个数。这就是 const 的作用。i 是不能在它处重新赋新值了。 

 

const int i = 20;
int const i = 20;//两者效果一样
int const *pi;
const int *pi;//两者效果一样

2. const int *pi的语义

//代码4.3
#include <iostream>

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;
}

这段代码输处结果是70;

注意第10行代码,pi 可以在任意时候重新赋值一个新内存地址

但第11行代码,i2 = 70 ,这里我们不能用*pi = 70 代替,因为关键字const的位置,表明*pi是个常量,而pi是个指针变量,可以继续赋值或者更改

 3.int *const pi 的语义

代码4.4
#include <iostream>

int main()
{
    using namespace std;
    int i1 = 30;
    int i2 = 40;
    int *const pi = &i1;
    //pi = &i2;此时pi是一个常量,无法进行修改或者赋值,因此这行被注释掉
    *pi = 80;//类比代码4.3
    cout << i1 <<endl;
}

输出结果是80;

pi 值是不能重新赋值修改了, 它只能永远指向初始化时的内存地址了 ;

这次的 pi 是一个指向 int 变量类型数据的指针常量

4.补充三种情况

情况一: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的值

情况二: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的值

 

 

おすすめ

転載: blog.csdn.net/m0_50829573/article/details/121321857