C与C++中的const

同样,有下面一段代码:

 1 #include <iostream>
 2 using namespace std;
 3
 4 int main()
 5 {
 6     const int i = 0;
 7     int *j = (int *) &i;
 8     *j = 1;
 9     cout<<"i address = 0x"<<hex<<&i<<","<<"j address = 0x"<<hex<<j<<endl;
10     cout<<"i value = "<<i<<","<<"j value = "<<*j<<endl;
11     system("pause");
12     return 0;
13 }

我们在C++编译器中运行如下:

我们发现const关键字严格遵守了其关于常量的定义。然而疑问出来了

为什么相同的地址会输出不同的值。

同样的代码我们放入C编译器中运行会发现输出结果:

i value = 1,j value =1

这是为什么呢?

以下是我自己的一点理解:

1.C语言中const为不可改变的变量,其实质仍然是变量,仍然会在编译期间分配内存

那么我们可以获取该内存并修改该内存处的值。这样虽然不允许直接对const 变量修改

但是间接修改该内存位置的值达到修改该变量的效果。

2.C++中const关键字定义的是常量类型,在编译的期间直接确定了其值,比如我们

可进行如下操作在C++中 编译是可以通过的

1 const int size=5;
2 int array[size];

表明在编译的时候size是已经确定了。然而这种情况在C语言的情况下是绝对不可以编译通过的,

其实我猜,当我们在c++中定义一个const类型的变量的时候,编译器也是要为其分配内存的,

只不过在编译阶段遇到时候直接替换,在运行的时候,该常量的值是直接存在某个寄存器中,这样

运行代码中需要用到该值时直接可从寄存器中索取,而非在内存中索取。

那么,我们可以作这样一种测试,我们把const前面加上volatile关键字防止编译器直接从寄存器中取

常量值,而是从内存中取,代码如下:

我们发现此时,const类型变量i的值是已经被改变了,则证明我猜想的思路也许是对的,又或许编译器

用了更复杂的方式处理,但是大概思路应该是这样吧

最后我们总结下:

前面说了那么多无非有以下两点:

1.C C++中的const变量是都要分配内存的。

2.C++只不过在编译的时候直接进行变量替换,同时在运行过程中直接在寄存器中取const变量的

   值,这是C++编译器优化的结果。

3.而对于C语言而言每次const使用都是直接从内存中取值,这样每次const变量的间接改变都能得到

   反映。

如果你有更好的理解欢迎一起讨论或者分享。

时间: 2024-10-22 18:12:08

C与C++中的const的相关文章

C++ 类中的const关键字

//类中的const关键字 #include<iostream> using namespace std; class Point{ public: //这个const关键字本质上修饰的是this指针 int GetX() const //====>int GetX(const this) { //因为this被隐藏,所以const关键字只好写在函数后面 //x++; //加上const关键字 报错 error C3490: 由于正在通过常量对象访问“x”,因此无法对其进行修改 //这个

C++总结:C++中的const和constexpr

C++中的const可用于修饰变量.函数,且在不同的地方有着不同的含义,现总结如下. const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象的常量性的操作都视为error. 对象的常量性可以分为两种:物理常量性(即每个bit都不可改变)和逻辑常量性(即对象的表现保持不变).C++中采用的是物理常量性,例如下面的例子: 1 2 3 4 5 6 7 struct A {     int *ptr; }; int k = 5, r = 6;

C++ 中有关const引用的一点小知识

在读<C++ Primer>时,发现之前对const的概念不是很清晰,只知道如何去使用,于是翻开const引用部分又阅读了一遍,发现有两点自己要注意的地方 1.const限定的对象不可以初始化非const引用 ex. 1 const int src = 512; 2 const int &ok_dest = src; //ok: 引用和初始化对象都是const 3 int &err_dest = src; //error : 引用为非const 原因很简单, src 是不可以被

详解C和C++中的const关键字

在讲下面的内容之前,要先看看这篇文章const.static变量的存储位置 一.C中的const 作用:(1)可以定义const常量,具有不可变性. (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患. (3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改. 同宏定义一样,可以做到不变则已,一变都变! (4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性. 还是上面的例子,如果在函数体内修改了i,编译器就会报错: (5) 可以节省空间,避免不必要的内存

C/C++中的const真正的用法

const基础知识(用法.含义.好处) intmain() { constint a; intconst b; constint *c; int* const d; constint * const e ; return0; } Intfunc1(const ) 初级理解:const是定义常量==>const意味着只读 含义: //第一个第二个意思一样代表一个常整形数 //第三个c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改) //第四个d常指针(指针变量不能被修改,但

C++中的const完全解析

1. const修饰普通变量和指针 const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的.对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变.例如:const int nValue:         //nValue是constint const nValue:    // nValue是const但是对于指针类型的TYPE

C/C++中的const与define

const int main() { const int a; int const b; const int *c; int * const d; const int * const e ; return 0; } 含义: 第一个第二个意思一样 代表一个常整形数 第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改) 第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改) 第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改) 结

c/c++中的const

const基础知识(用法.含义.好处) const int a; int const b; const int *c; int * const d; const int * const e ; 含义: 第一个第二个意思一样 代表一个常整形数: 第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改): 第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改): 第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改). const的好处

C++中顶层const和底层const

1. 顶层 const 与底层 const 概念 指针本身是一个对象,由于,指针实际相应着内存单元的一段存储空间,然而,指针所指向的也是一个数据对象,因此,指针是一个常量与指针所指向的是一个常量是两个全然不同的概念, 顶层 const 表示的是 指针本身是一个常量, 底层 const 表示的是 指针所指的对象是一个常量,更普通情况下, 顶层 const 能够表示随意对象是一个常量,这对于算术类型.类.指针等不论什么数据类型都是成立的, 底层 const 则与指针和引用等复合类型的基本类型部分有关