经常看到“指针常量”和“指针常量”,傻傻分不清,今天来盘明白。
这个应用主要是将const关键字和指针结合在一起,根据const的应用位置,可以分为两种:一种是让指针指向一个常量对象(常量指针),可以防止使用该指针来修改所指向的值;另外一种是指针本身声明为常量(指针常量),可以防止改变指针所指向的位置。
1. 常量指针
根据这个命名可以写出表达式,const int *pt = &months; 常量在前,指针在后。根据定义,不能使用 (*pt) ++ 等来修改months的值,因为指针指向的是一个只读的对象,但是可以修改months变量本身的值。
输出1是指针所指向month变量的地址;
输出2是变量值9;
输出3是变量month+1后的值,*pt依旧是指向months变量;
输出4是将原指针地址增加了一个int字节数(本人电脑int占4字节)的直接数十进制值,它已经不再是指向months = 10 这个变量;
输出5即原指针变量pt + 1后所指向变量的地址。
使用const修饰的变量能够将地址赋值给常量指针,但不能直接赋值给未被const修饰的指针,因为被const修饰的变量值是不变的,一般指针又是可以修改所指向变量值,相互矛盾。 因此,使用常量指针既可以指向非const数据(上图中的months),也可以指向const数据,但一般指针不可指向const数据。
2. 指针常量
顾明思义,指针是个常量, int * const pt = &months,那么指针所指向的地址就不可改变,也就是不能通过操作pt来改变months大小,但是可以修改month大小。
输出1是pt指向地址;
输出2是pt指向地址的变量值;
输出3是所指地址上的变量值+1;
输出4是所指地址上的变量值再+1;
输出5是运算后的pt指向地址;
输出6是运算后变量months的地址。
所以,常量指针强调的是指针所指向对象的只读性,它可以指向const限定变量或者非限定变量,对于非const限定对象,不能通过常量指针" *pt "来改变变量的大小,指针常量则强调指针所指向地址的不变性。