空暇时候思考之const

对于多数人来说那些const的使用方法比方修饰返回值和修饰參数都应该是十分好理解的下来我要讨论


对于C语言中

#include <stdio.h>

void main()
{
	const int a=10;
	int *p =(int*) &a;
	*p = 100;
	printf("%d\n",a);
}

上边输出100

对于C++中

#include<iostream>
using namespace std;

void main()
{
const int a=10;
int *p =(int*) &a;
*p = 100;
printf("%d\n",a);
}
上边输出10


原因是什么呢。C中为const是一个不能被改变的变量,有内存空间的分配,所以能够在内存中通过地址改变

C++中的const是一个常量,通常是保存在字符表中,不分配内存。仅仅是在方位该变量的时候或者查看变量的地址的时候就会又一次分配一个同名变量与const的常量的值同样,所以此时输出的地址是这个新变量的地址。所以通过地址改变的还是这个变量的值。可是输出的时候编译器还是会在符号表里面读取这个常量的值,所以值未改变


const int size;

//c中const默认外部链接这里仅仅是一个声明而已

const int bufsize = 100;
char buf[bufsize];//这在C语言中是非法的,由于c语言中bufsize是一个不能改变的变量
                 //可是这在C++中合法的。由于C++中不为bufsize建立存储空间。仅仅是存储在符号表中
                  
//可是C++中const默认内部连接,假设要在多编译单元中使用必须设置为
extern const int bufsize=100;    //改为外部连接,此时就是强制为const创建空间
extern const int bufsize;//这在c++中仅仅是声明,仅仅能在初始化的时候才分配内存
//在c++中一个const不必建立空间,可是c中const必须建立空间    
 
const int i[] = {1,2,3,4};//集合不能保存到符号表中。所以仅仅能也必须分配内存
float f[i[3]];//编译期间的值是不能使用的。由于编译期间编译器就不知道存储器的内容
struct S
{
    int i;
    int j;
};
const S s[] = {{1,2},{3,4}};

int main()
{

}

posted on 2017-06-04 10:35  yjbjingcha  阅读(147)  评论(0编辑  收藏  举报

导航