对于多数人来说那些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()
{
}