C++ const原理

来源:互联网 发布:应用备份软件 编辑:程序博客网 时间:2024/06/05 11:46

抛出问题 
下列代码输出的结果是什么?

#include<stdio.h>#include<iostream>using namespace std;int main(){/*在c++下*/    const int a = 10;    //a = 100;error    int *p = (int*)(&a);    *p = 100;//正确    cout << *p << endl;    cout << a << endl;    system("pause");}

resault:

100 
10

讲解学习

原理

在C++中,被const修饰的变量,可能为其分配存储空间,也可能不分配存储空间。 
有下面两种情况,会为这个变量分配存储空间:

1、当const常量为全局,并且需要在其它文件中使用时,(extern) 
2、当使用取地址符(&)取const常量的地址时。

如果没有为这个变量分配空间的情况下,这个变量是不可能被改变的,也就是说,这个变量是实实在在的常量。这种情况下,没有任何争议。

解疑

下面咱们讨论文章的一开始举得例子。

const int a = 10;

变量a=10,a放在了符号表里面,这个值永远不会变。当取a的值的时候,就从符号表里面取,永远是10.

int *p = (int*)(&a);

定义一个新的指针变量p,指向变量a的地址。这时,会在栈上为变量a分配一个新的空间,存放变量a的值。然后用指针p指向这个空间。例如这个内存空间的地址是0x00FF00CC。

*p = 100;

把内存地址0x00FF00CC空间的值修改为100。

cout << *p << endl;//从内存0x00FF00CC中取值,等于100.cout << a << endl;//从符号表中取值,等于10.

c语言中的const

int main(){/*在c下*/    const int a = 10;    //a = 100;//error    int *p = (int*)(&a);    *p = 100;//正确    printf("%d\n", *p);//100    printf("%d", a);//100    system("pause");}



static int  val_a = 1 ; // 初始化的静态变量 int  val_b = 2 ;        // 全局变量 const int  val_c = 3 ;  // const 全局变量 static int  val_d ;     // 未初始化的静态变量 int  val_e ;            // 未初始化的全局变量int main(){    static int val_f = 5;  // 初始化的局部静态变量    static int val_g;      //未初始化局部静态变量    int    val_h = 6;      //初始化局部变量    int    val_i;          //未初始化局部变量    const  int val_j = 7;  //const局部变量    return 0;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

①static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放,例如:val_a、val_d、val_h、val_i。

②const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放,例如:val_c;const局部变量存储在栈中,代码块结束时释放,例如:val_j。

③全局变量存储在全局/静态区域,在编译期为其分配内存,在程序结束时释放,例如:val_b、val_e。

④局部变量存储在中,代码块结束时释放,例如:val_h、val_i。

注:当全局变量和静态局部变量未赋初值时,系统自动置为0。


原创粉丝点击