区分const char* p,char* const p

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hhhuang1991/article/details/80179496

我们从常规的指针开始,

char* p = new char[5]; //在内存中申请5个字节的空间,并将空间地址赋给指针变量p

指针变量p可以保存一个内存地址值,还可以去操作这个内存地址对应位置的内容,使用解引用操作符*,用*p表示。由此可见,通过指针变量p,就可以对内存进行读写操作。有时候,我们只需要读取某个内存的内容,而不需要去改变它,这样我们可以通过const修饰符去限定,以免造成不必要的错误。

const char* p = "Hello";  //等同于char const *p = "Hello";

上面这种写法,const修饰char,表示指针变量p所指向的内存中的内容不能被修改,但是指针变量p可以被修改。也就是说,*p是不可改变的,但是p是可以改变的,

p[0] = 'N';  //编译失败,提示p[0]为不可以修改的内存块
char ch[] = "china";
p = ch;  //成功,p是一个指针变量,可以被赋与另一个指针变量

既然p是一个指针变量,那么它肯定也能被const限定,从而不能被改变,

char* const p = "Hello";

与前面的限定不一样,这次const修饰p,也就是指针变量,说明p不可改变,但是char没有const修饰,因此*p是可以被改变的,

p[0] = 'Y';  //成功,p[0]指向的内存块没有const修饰,可以被修改
char ch[] = "china";
p = ch;  //失败,p是一个const指针变量,不可以被修改

当然,也可以将上面的两种情况合在一起,const char* const p;,这样*p和p都不能被改变。

一般来讲,数组名相当于一个指针变量,可以用操作指针的方法来操作数组名。同时,数组名是一个const指针变量,不能被修改
char ch[] = "china";
char* p = "love";
ch = p; //失败,ch不可改变,但是*ch可变
所以,char ch[]中的ch与char* const p中的p性质一致。const char ch[]中的ch与const char* const p中的p性质一致。

猜你喜欢

转载自blog.csdn.net/hhhuang1991/article/details/80179496
今日推荐