指针和常量
| 类型 | 指针本身(地址)是否可变 | 指向的内容是否可变 | 声明方式 |
|---|---|---|---|
| 指向常量的指针 | 可以 | 不可以 | const int* 或 int const* |
| 常量指针 | 不可以 | 可以 | int* const |
| 指向常量的常量指针 | 不可以 | 不可以 | const int* const 或 int* const const |
int a=1,b=2;
{
const int* pt;
// int const* pt; // same
pt=&a;
cout<<(*pt)<<'\n'; // 1
pt=&b;
cout<<(*pt)<<'\n'; // 2
// *pt=3; // CE
}
{
int* const pt=&a;
cout<<(*pt)<<'\n'; // 1
*pt=3;
cout<<(*pt)<<' '<<a<<'\n'; // 3 3
// pt=&b; // CE
}
{
const int* const pt=&a;
// int const* const pt=&a; // same
cout<<(*pt)<<'\n'; // 1
// *pt=3; // CE
// pt=&b; // CE
}
当处理下标带偏移量的数组时,可以这样写:
int tf[S*2];
int* const f=tf+S;
// f[i] same as tf[S+i]
这样编译器才可以去优化,并且编译行为和直接用 tf[S+i] 一致。如果写成 int* f=tf+S 的话,编译器会认为指针可能乱飘而优化不彻底。