关于const int * ,int const * 以及 int * const 的区别

指针和const


const指针(常量指针):

int * const :
int * const:
指针是一个对象,而引用不是,引用是所指对象的别名。
    1. 所以指针的用法可以像其他对象类型一样,允许把指针本身定义为一个常量。
    2. 常量指针必须初始化,一旦初始化完成,它的值(也就是它所放在指针中的地址就不能改变)
    3. 而它解引用的值可以随着它所指向地址中值的变化而变化。

下面我们通过例子来更好的理解一下:

1. 常量指针必须初始化:
#include <iostream>
using namespace std;
int main()
{
    int * const p;
    return 0;
}

这里写图片描述

2. 常量指针一旦初始化完成,它的值,也就是它所放在指针中的地址就不能变
#include <iostream>
using namespace std;
int main()
{
    int i = 10;
    int j = 20;
    int * const p = &i;
    p = &j;//p就是一个常量,所以不能给p赋值
    return 0;
}

这里写图片描述

3. 常量指针 解引用*的值 可以随着它所指向地址中的值的变化而变化
#include <iostream>
using namespace std;
int main()
{
    int i = 10;
    int* const p = &i;

    i = 20;
    printf("p = %d \n",*p);
    return 0;

}

这里写图片描述

指向常量的指针(const int * 和 int const *)


1. 两者的作用是一样的,都是一个指向常量的指针。
2. 可以不用先初始化,即指针没有指向任何内容。
3. 指针指向的内容是一个常量(即地址),可以通过改变常量(地址)中的值来改变指针解引用的值。但是不能直接解引用指针来改变值,因为这里的指针是一个常量。
4. 也可以将另外一个常量赋值给指针,来改变指针所指向内容的值。
1. 可以先不用初始化

(这里就是和int * const 的不同,常量指针必须初始化,之后所指向的内容就不能改变)

#include <iostream>
using namespace std;
int main()
{
    const int * p;//未初始化
    int i = 10;
    p = &i;
    printf(" p = %d \n",*p);
    return 0;
}

这里写图片描述

2. 指针指向的内容是一个常量(即地址),可以通过改变常量(地址)中的值来改变指针解引用的值。但是不能直接解引用指针来改变值,因为这里的指针是一个常量。(这里的用来同常量指针,即它们三个的相同之处)
#include <iostream>
using namespace std;
int main()
{
    int i = 10;
    const int * p = &i;
    *p = 20;//不能直接解引用指针来改变值
    printf(" p = %d \n",*p);
    return 0;
}

这里写图片描述

#include <iostream>
using namespace std;
int main()
{
    int j = 20;
    const int * p = &j;
    j = 30;
    printf(" p = %d \n",*p);
    return 0;
}

这里写图片描述

3. 也可以将另外一个常量赋值给指针,来改变指针所指向内容的值。

(这里就是和常量指针的不同之处,常量指针只能指向一个地址,而指向常量的指针可以指向不同的常量(地址),可以改变)

#include <iostream>
using namespace std;
int main()
{
    int i = 10;
    int j = 20;
    const int * p = &i;
    p = &j;
    j = 30;
    printf(" p = %d \n",*p);
    return 0;
}

这里写图片描述


上面就是我对指针和const的理解,我觉得还是较为全面的。下面还有一种类型,就是两者合并起来的 指向常量对象的常量指针。

指向常量对象的常量指针:

#include <iostream>
using namespace std;
int main()
{
    const int j = 20;
    const int * const p = &j;
    j = 30;//变量j是常量,不能赋值
    printf(" p = %d \n",*p);
    return 0;
}

这里写图片描述

#include <iostream>
using namespace std;
int main()
{
    const int i = 10;
    int j = 20;
    const int * const p = &i;
    p = &j;
    printf(" p = %d \n",*p);
    return 0;
}

这里写图片描述

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值