您的位置:首页 > 其它

const,指针,数组,指针常量,常量指针等归纳总结

2014-09-02 17:37 357 查看
1、char* const p (指针常量)

指针是常量,指针的值不能改变,但是指针指向的值可以改变。

char data = 'a';

char buf = 'b';

char* const p = &data; //指针的值不能改变,但是指针指向的值可以改变

//p = &buf; //error:assignment of read-only variable‘p’

*p = 'A';

cout<<*p<<endl; //A

2、const char* p (常量指针)

即,指向常量的指针。指针的值可以改变,但是指针指向的值不能改变。

char data = 'a';

char buf = 'b';

const char* p = &data;

p = &buf;

//*p = 'A'; //error:assignment of read-only
location‘*p’

3、const修饰数组

3.1 const char array[]

数组中的每个元素是const,不能改变

const char array[5] = {'0', '1', '2', '3', '\0'};

//array[3] = 'a'; //error:assignment of read-only location ‘array[3]’

3.2 char const array[]

同3.1 数组中的每个元素是const,不能改变

char const array[5] = {'0', '1', '2', '3', '\0'};

//array[3] = 'a'; //error:assignment of read-only location ‘array[3]’

3.3 数组的个人理解

数组,就是几个类型相同的元素。个人认为数组 char array[2] 可以理解成(char array) [2]。 该数组包含两个元素,每个元素是char类型。按照这种方法,上面的3.1和3.2就可以看成

(const char array) [5] ,数组中每个元素是cosnt char

(char const array) [5],数组中每个元素是 char const

由于const char, char const 是等价的。所以上述3.1 与 3.2 表现一致。带着这样的观点,我们来看下下面的介绍。

4、const char* array[]

char data = 'a';

char *p = &data;

const char* array[5] = {p, p, p, p, NULL};

array[0] = NULL;

//*(array[1]) = 'A'; //error:assignment of read-only location ‘* array[1]’

通过这段代码可以看出:

(1) array[0]的值可以更改,即数组中每个元素不是常量,指针的值可以改变;

(2) array[1] 指向的值不能更改,即指针指向的值不能改变;

综合(1)(2),可以知道这其实就是一个常量指针 ( 第2节)。 那么再用3.3的观点验证一下:const char* array[5] 可以表述成 (const char* array) [5], 数组有5个元素,每个元素是const char*类型的,即指向常量的指针!

5、char* const array[]

char data = 'a';

char *p = &data;

char* const array[5] = {p, p, p, p, NULL};

//array[0] = NULL; //error:assignment of read-only location ‘array[0]’

*(array[0]) = 'A';

通过这段代码可以看出:

(1) array[0]的值不能改变,即数组中每个元素是常量,指针的值不能改变;

(2) array[0] 指向的值可以更改

综合(1)(2),可以知道这其实就是一个指针常量 ( 第1节)。 那么再用3.3的观点验证一下:(char* const array)[5],数组中每个元素的类型是char* const,即每个元素是指针常量:指针的值不能改变,但是指向的值可以改变!

6、const char **pp;

char data = 'a';

char *p = &data;

const char* array[5] = {p, p, p, p, NULL};

const char **pp = array;

//*(*pp+1) = 'A'; //error: assignment of read-only location ‘*((* pp) + 1u)’

//**pp = 'A'; //error: assignment of read-only location ‘* * pp’

*pp = NULL; //OK

pp = NULL; //OK

const char**的类型是:“指向一个有const限定符的char类型的指针的指针”。从上面的代码可以看出pp指针可以改变,pp指向的值(*pp)也可以改变。这里const不是限定pp的。*pp其实就是array,这里将*pp替换成array,本节的情况就可以转化成第4节的内容。

同理 char* const *pp 可以转换成第5节的内容。

7、char** const pp

char data = 'a';

char *p = &data;

char* array[5] = {p, p, p, p, NULL};

char** const pp = array;

**pp = 'A';

*pp = NULL; //OK

//pp = NULL; //error: assignment of read-only variable ‘pp’

cout<<data<<endl; //A

从上述代码可以看出:pp是一个常量,pp的值不能改变,但是pp指向的值可以改变。

上述几点仅为个人总结,如有不足之处,欢迎指出。谢谢!



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: