指针常量和常量指针的区别
指针常量:即指针本身的值是不可改变的,而指针指向的变量的值是可以改变的;
常量指针:即指针指向的变量的值是不可改变的,而指针本身的值是可以改变的;
因为指针本身也是一个变量,只不过指针存放的是地址而已,而一旦指针变成了常量,即指针本身的值是不可变的,此时指针只能指向固定的存储单元;
指针一般会指向一个变量,如果该变量成为一个常量,那么该变量的值就不能被修改,即常量指针,指针指向的是一个不可变的变量。
对于常量指针,其所指向的变量的值是不可变的,即所指向地址中的值不可变,不能通过指针去修改其所指向的的值,但是可以通过该变量自己修改。
例:
int a = 3;
int const *p = &a;
*p = 4; 错误
a = 4; 正确
总结:
1、在C语言中用const去修饰一个变量,表示该变量是只读,不可以显示的调用a去修改a的值,并且此时a仍然是一个变量,不能等同于常量;
2、要注意const在声明变量时所处的位置,位置不同,在意义上可能会有很大的区别。
如果const在‘*’左边,则表示指针指向的变量的值是不可变;
如果const在‘*’右边,则表示指针的变量的值是不可变的。
typedef char * pStr;
char string1[4] = "abc";
char string2[4] = "def";
const char *p1 = string1; 此时其变为常量指针
const pStr p2 = string1; 此时其变为指针常量
p1[1] = 'f'; // 此句错
p1++; // 此句对
p1 = string2; // 此句对
p1[1] = 'x'; // 此句错
p2[1] = 'f'; // 此句对
p2++; // 此句错
p2 = string2; // 此句错
在const char *p1中,const的作用力量在p1所指的内容,也就是说,当p1指向string1时,string1的内容相对于p1来说是常量,是固定的,是不能改变的,所以p1[1] = 'f'这一句就是错误的,而p1自身的值(即地址值)是可以改变的,所以p1++和p1 = string2都是正确的。
在const pStr p2中,const的作用力量在p2,即p2是个常量,p2的值实际上是个地址,也就是说,p2已经固定了,它的值是不能变的,但它这个地址所指的内容是可以改变的,所以p2[1] = 'f'是对的,但p2 = string2是错误的,因为这句是想将另一个地址赋值给p2。
总体来说,一个是将内容固定为常量,一个是将地址固定为常量,也就是指针常量和常量指针的说法,p1是常量指针,p2是指针常量。这也是C中指针的魅力所在。
typedef char* PCHAR;
PCHAR m1,m2;
char* m3,m4;
对于上面的四个变量,其中属于指针变量的只有m1/m2/m3;m4不是指针变量;对于上面的例子,被const修饰之后的,其所修饰的对象将变成常量,其值将不可以再被改变。故对于p1,其内容被固定为常量,而对于p2,其地址被固定为常量。