栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

const与指针的关系

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

const与指针的关系

文章目录

目录

文章目录

一、const关键字

1.const简介

2.const的使用

 二、const与指针的关系

1.c语言与c++中const的区别

2.const与指针的关系


一、const关键字

1.const简介

当const修饰一个变量时,该变量的数据只能被访问不能被修改,也就是"只读",编译器会把const修饰类型的对象放入只读内存中

2.const的使用

代码示例:

    const int n = 10;
    
    int b = 10;
    const int* p = &b;
    

错误示例:

    const int n = 10;
    n = 20;//n被const修饰,不能改变其值,编译不通过

    int b = 10;
    const int* p = &b;
    *p = 100;//error 

 

 二、const与指针的关系

1.c语言与c++中const的区别

在C语言中,const以变量为主,而在C++中,const以常性为主。下面通过一些示例来理解二者区别。

举例1:

const int n = 10;

int ar[n]{1,2,3}; // C语言中编译不通过,而C++编译通过

原因:在C语言中,n是变量属性,而数组定义时,[ ]内必须为整型常量,因此报错,而在C++的编译过程中,会在将n替换为字面常量10,所以在C++中,int ar[n]{1,2,3}相当于 int ar[10]{1,2,3},故编译通过。

举例2:

int main()
{

    const int a = 10;
    int b = 0;
    int* ip = (int*)&a;
    *ip = 100;
    b = a;
    printf("a = %d b = %d *ip = %dn", a, b, *ip);

    return 0;
}

上面这段代码按C语言编译结果:a=100 b=100 *ip=100,按C++方式编译结果:a=10 b=10 *ip=100,这是因为在C语言中是从a空间中取值,而C++中则是编译时将a替换为字面常量10。

这一点我们可以从反汇编代码中看出

C++中查看反汇编

2.const与指针的关系

(1)const 修饰离它距离最近的变量

代码示例:

int main()
{
    int a = 10, b = 20;
    int* p1 = &a;
    *p1 = 100;//1 编译通过
    p1 = &b;//2 编译通过

    const int* p2 = &a;
    *p2 = 100;//3 编译不通过
    p2 = &b;//4 编译通过

    int* const p3 = &a;
    *p3 = 100;//5 编译通过
    p3 = &b;//6  不通过

    const int* const p4 = &a;
    *p4 = 100;//7 不通过
    p4 = &b;//8 不通过

    return 0;
}

以上代码中,没有const修饰,指针的值能够进行改变,1,2都能编译通过。

const int* p2中,const修饰的是*p2,所以不能通过修改*p2来改变a的值,但可以改变p2的指向。

int* const p3中const修饰的是p3,可以通过修改*p3来修改a的值,但是p3指向不能改变。

const int* const p4 二者都被const修饰,均不可改变。

(注意:指针包含两个部分的值,一个是指针自身的值(指向谁的地址),一个是所指向的变量的值)

(2)遵循赋值兼容性原则 

能力强的能够赋值给能力弱的

代码示例:

int main()
{
    int a = 10, b = 20;
    int* p = &a;
    int* s1 = p;// √
    const int* s2 = p; // √
    int* const p3 = p;// √
    const int* const s4 = p; //√


    return 0;
}

以上代码中,p没有const修饰,p的指向可以改变,也可以通过改变*p来改变a的值,*s2可以改变指向,但不能通过*s2的改变来改变a的值,所以相对于s2,p的能力较强,因此编译能够通过。依次类推,如此方法上述判断均可通过。

若用const修饰*p(const int*p),如下:

    int a = 10, b = 20;
    const int* p = &a;
    int* s1 = p;// ×
    const int* s2 = p; // √
    int* const p3 = p; // ×
    const int* const s4 = p; // √

若const修饰p(int* const p),都可以通过。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/835793.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号