1、const char* , char const * , char * const 之间的关系
const char * p: p是一个指向常量字符的指针。指针所指的对象不能通过*p去改变(可以通过其他方式改变,与指针p无关),但是指针本身是可以改变的,也就是p可以去指向其他的char对象。p所指对象可以是常量的,也可以是非常量的,也就是常量的地址必须用指向常量的指针来存放,但是指向常量的指针可以存放常量或者非常量的地址。
char const * p : 和上面是一样的,表示的是一个指向常量的指针,不可通过*p来改变所指的对象。
char * const p : p是一个常量指针,自身所存放的指向对象的地址不可改变,指向的对象可以是常量也可以是非常量。常量指针必须初始化,不可二次改变。
2、 const char * 怎么定义与初始化呢?
const char * p : p是一个指向字符常量的指针,p里面存放的是字符常量的地址。
下面我们来看一个例子,我们想初始化一个const char *p:
const char* p1 = "abc";
const char* p2 = 'abc';
const char* p3[] = {"ab", "b", "c"};
const char* p4[] = {'ab', 'b', 'c'};
上面哪个初始化的正确的呢?
答案是 p1 和 p3。想要搞清楚这个问题,那我们先来搞搞清楚 ‘a’ 和 “a”的区别吧。
3、‘a’ 和 “a” 的区别
也就是字符与字符串的区别。
‘a’是一个字符,就像123是一个整形常量一样,是一个右值类型。
“a”是一个字符串,实际表示的是“a”存放的地址。怎么理解呢?
“abcd”这样一个用双引号的字符串,本质上是存放字符的一维数组,以 结束符结束。使用”abcd”相当于使用数组名,也就是使用数组首元素的地址,即字符‘a’的地址。
好了,解释完了字符与字符串的区别,我们再来看前面的初始化。
const char* p1 = "abc";
p1 是一个指向常量对象的指针,也就是说p1里面存放的应该是地址。而”abc”实际表示的就是首元素‘a’字符的地址。所以初始化是正确的。
const char* p2 = 'abc';
p2定义为指向字符常量的指针,应该存放一个地址值。但是右面‘abc’是一个字符常量,不是地址,所以初始化是错误的。
const char* p3[] = {"ab", "b", "c"};
p3定义为一个存放指向字符常量指针的数组。右边的{“ab”, “b”, “c”}表示的就是三个指向字符常量的地址值。
const char* p4[] = {'ab', 'b', 'c'};
p4定义为一个存放指向字符常量指针的数组。但是右边的{‘ab’, ‘b’, ‘c’}是三个字符常量,并不是地址值。所以初始化是错误的。
未完待续……