c语言和c++语言中const修饰的变量区别浅析

 更新时间:2022年02月18日 10:40:14   作者:是小明同学啊  
这篇文章主要给大家介绍了关于c语言和c++语言中const修饰的变量区别的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

c:

修饰全局变量:

用const修饰的全局变量是没有办法直接修改的,间接的修改也是不成功的(语法可以通过,但是编译运行的时候会报错。)(const只要是修饰全局变量,那么就会储存到常量区中,收到常量区的保护。)

修饰局部变量:

但是如果用const修饰局部变量,同样的也是没有办法直接修改的,但是是可以间接修改的。

int main()
{
    const int b = 10;
    int* p = &b;
    *p = 20;
    pirntf("%d",b);
    return 0;
}

这样就不会报错。(const修饰的局部变量是储存到栈上,相当于分配到内存上,可以修改成功)。

通常叫这种变量为伪常量,不能用这种常量不能构成数组。arr[伪常量]这种写法是错误的。

c++:

修饰全局变量:

const修饰全局变量的效果是和c语言的一样的。无论是直接修改还是间接修改都是报错的。

修饰局部变量:

const修改局部变量,直接修改是不成功的,不会报错,但是输出的结果是修改前的值,相当于没有修改。因为在c++中,const修饰的无论是局部变量还是全局变量都是常量了。数组的初始化可以使用这个const修饰的变量了。

int main
{
    const int a = 100;
    int* p  = (int *)&a;
    *p  = 200;
    cout<<a<<endl;//100
    return 0
}

输出的结果依然是100,注意给p指针赋值的时候需要将&a进行强制类型转换(c++的要求,因为这个时候&a的类型是const int*)

剖析这个代码:

int *p = (int *)&a

实际上是int temp = a 先在栈上创建了一个和a的值一样的变量temp,

当对const修饰的局部变量取地址的时候,编译器会给变量分配临时的内存空间,这个内存空间就是temp的内存空间。而给p赋值的时候就是将这个临时变量的空间的地址赋值给了p。

也就是int*p = &temp然后p指针指向的也就是temp,所以说后来的*p = 200改的就是temp而不是a的值。临时空间没有什么意义。

(const int a =100写出来了以后就一直放在符号表中(键值对一一对应着不会改变。))

总结:

在c++语言中,一个const修饰的变量不是必须创建内存空间的,c语言中,总是需要一块内存空间。

在c语言中:

对于全局变量:

将const修饰的全局变量存储在只读数据段,保存在符号表中,第一次使用的时候再分配内存,程序结束的时候释放。(这个是不能修改的,因为存储在只读数据段中)

对于局部变量:

将const修饰的局部变量存储在栈中,代码块结束的时候释放。(这个是可以修改的,在栈上)

在c++语言中:

对于全局变量:

是否为const变量分配内存空间取决于const变量的用途。如果是作为一个值(用这个值去替换一个函数名),就不分配空间。如果是对这个全局变量取地址,那么会分配内存,存储在只读数据段。两种都是不能进行修改的。

对于局部变量:

如果是const int a = 100;直接放进符号表中,不分配内存。如果对其取地址的话,在栈上分配内存空间temp,修改不成功,因为修改的只是temp的值,对在符号表中的a没有影响。

如果是const int a = b;分配内存。

如果是自定义的类型,比如类对象,分配内存。

总结

到此这篇关于c语言和c++语言中const修饰变量区别的文章就介绍到这了,更多相关c语言和c++中const修饰的变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言排序算法之冒泡排序实现方法【改进版】

    C语言排序算法之冒泡排序实现方法【改进版】

    这篇文章主要介绍了C语言排序算法之冒泡排序实现方法,结合具体实例形式分析了C语言实现的基本冒泡排序实现方法及增设flag标志位的改进型算法,需要的朋友可以参考下
    2017-09-09
  • 一文让你彻底明白C++中的const

    一文让你彻底明白C++中的const

    这篇文章主要给大家介绍了关于C++中const的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 使用C语言打造通讯录管理系统和教学安排系统的代码示例

    使用C语言打造通讯录管理系统和教学安排系统的代码示例

    这篇文章主要介绍了使用C语言打造通讯录管理系统和教学安排系统的代码示例,利用C语言强大的数组和指针能够更加清晰地体现设计思路:D 需要的朋友可以参考下
    2016-06-06
  • C语言 auto和register关键字

    C语言 auto和register关键字

    这篇文章主要介绍了C语言 auto、register关键字,文章通过变量展开全文相关的详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • C++泛型模板约束深入讲解

    C++泛型模板约束深入讲解

    C/C++ 作为 C# 语言的前置版本,ECMA工业化编程语言,自然是存在 “泛型模板约束” 的功能的,只是本文不以 C/C++ 20 新语法搞出来的 “requires” 关键字来实现,它很难用
    2022-09-09
  • C++ 约瑟夫环的实例代码

    C++ 约瑟夫环的实例代码

    这篇文章主要介绍了C++ 约瑟夫环的实例代码的相关资料,希望通过本文能帮助到大家,实现这样的功能,需要的朋友可以参考下
    2017-10-10
  • C语言驱动开发之内核文件的读写

    C语言驱动开发之内核文件的读写

    这篇文章主要为大家详细介绍了C语言驱动开发中内核文件的读写的系列函数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • 详解Matlab中自带的Java操作合集

    详解Matlab中自带的Java操作合集

    其实Matlab中也有一些自带的Java操作,例如:获取鼠标在全屏位置、获取当前剪切板内容、获取鼠标处像素颜色等,本文总结了七个这样的操作,感兴趣的可以了解一下
    2022-03-03
  • C++中的const限定符的使用和作用

    C++中的const限定符的使用和作用

    C++ 中的 const 限定符用于声明不可变量,即在变量声明时指定该变量的值不可修改。它的使用可以帮助程序员避免一些常见的编程错误,如误修改不应该被修改的变量的值等
    2023-05-05
  • VS2019开发简单的C/C++动态链接库并进行调用的实现

    VS2019开发简单的C/C++动态链接库并进行调用的实现

    这篇文章主要介绍了VS2019开发简单的C/C++动态链接库并进行调用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论