这一章我们详解一下指针的一个修饰符—const。
Const修饰符的不同位置,表示的不同的作用,定义如下:
char * const Ptr_ConstChar = “a”;
const char * pConstChar_Ptr;
const char * const pConstChar_ConstPtr = “ab”;
如何识别和记住这些差异,关键点就看const的位置,记住一点,它总是修饰的它后面紧挨着的内容。Const的意思就是固定,不能改变的意思(专业术语叫常量)。
解读1:char * const Ptr_ConstChar = “a”;
这是一个常量指针,const是修饰Ptr_ConstChar变量的,说明该指针变量为const类型,表示其本身不可以被修改。但是它指向的内容可以通过这个常量指针去修改。
它的初始化也不能通过赋值方法,只能通过定义的时候初始化。
解读2:const char * pConstChar_Ptr;
这是一个指针常量,所指向的对象为字符类型的常量,const 是修饰char类型标识符的,它说明该变量本身可以修改(可以用不同的char类型变量赋值),但是不能使用该变量去修改所指的对象,只能使用它来访问所指向的对象。
在程序运行期间保持不变,即不能放在赋值符合的左边,数组名就是一个指针常量的特例。
常见的string类型操作的参数都是这样定义的,比如:
char *strcpy(char * __restrict /s1/, const char * __restrict /s2/)
第二个参数就是一个常量字符串,这样可以避免被误修改。
解读3:const char * const pConstChar_ConstPtr = “ab”;
一个指向常量数据的常量指针,两者皆不可以修改。和C++里面定义一个常量宏类似。
如下代码,分别测试了这三种类型的定义的差异和使用方法。
int TestPointer1(void)
{
const char alpha[] = "12345";
char * const Ptr_ConstChar = "a"; //常量指针
const char * pConstChar_Ptr; //指针常量
const char * const pConstChar_ConstPtr = "ab"; //指向常量数据的常量指针
char a;
// Ptr_ConstChar = alpha; //不能赋值,因为不能修改
// Ptr_ConstChar = "a"; //不能赋值,因为不能修改
a = *Ptr_ConstChar; //可以访问指向的内容
*Ptr_ConstChar = 1; //可以修改指向地址的内容
// *pConstChar_Ptr = 1; //不可以修改指向的地址的内容
pConstChar_Ptr = alpha; //可以用数组去初始化
pConstChar_Ptr = "a"; //可以用字符串去初始化
pConstChar_Ptr++; //可以被修改
a = *pConstChar_ConstPtr; //仅仅可以访问指向地址的内容
return a;
}
如果对一个char * const Ptr_ConstChar定义的指针进行赋值,会提示如下错误“表达式必须是一个可以编修的值”,说明Ptr_ConstChar是不可以修改的。
原创文章,欢迎转载,请注明来源,未经书面允许,请勿用于商业用途。