一些语法技巧

指针和常量

类型 指针本身(地址)是否可变 指向的内容是否可变 声明方式
指向常量的指针 可以 不可以 const int*int const*
常量指针 不可以 可以 int* const
指向常量的常量指针 不可以 不可以 const int* constint* 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 的话,编译器会认为指针可能乱飘而优化不彻底。