情况一:int * pi指针指向const int i常量的情况
//**********begin*****************
const int i1=40;
int *pi;
pi=&i1; //这样可以吗?不行,VC下是编译错。
//const int 类型的i1的地址是不能赋值给指向int 类型地址的指针pi的。否则pi岂不是能修改i1的值了吗!
pi=(int* ) &i1; // 这样可以吗?强制类型转换可是C所支持的。
//VC下编译通过,但是仍不能通过*pi=80来修改i1的值。去试试吧!看看具体的怎样。
//***********end***************
情况二:const int * pi指针指向const int i1的情况
//*********begin****************
const int i1=40;
const int * pi;
pi=&i1;//两个类型相同,可以这样赋值。很显然,i1的值无论是通过pi还是i1都不能修改的。
//*********end*****************
情况三:用const int * const pi申明的指针
//***********begin****************
int i
const int * const pi=&i;//你能想象pi能够作什么操作吗?pi值不能改,也不能通过pi修改i的值。因为不管是*pi还是pi都是const的。
//************end****************
一:对于基本声明
1.const int r=100;
//标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域
为此文件,编译器经过类型检查后直接用100在编译时替换.
2.extend const int r=100;
//将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行
初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.
3.const int r[]={1,2,3,4};
struct S {int a,b;};
const S s[]={(1,2),(3.4)};
//以上两种都是常量集合,编译器会为其分配内存,所以不能在编译期间使用其中
的值,例如:int temp[r[2]];这样的编译器会报告不能找到常量表达式
二:对于指针
1.const int *r=&x;
//声明r为一个指向常量的x的指针,r指向的对象不能被修改,但他可以指向任何
地址的常量.