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指向的值可以改变。
上述几点仅为个人总结,如有不足之处,欢迎指出。谢谢!
指针是常量,指针的值不能改变,但是指针指向的值可以改变。
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指向的值可以改变。
上述几点仅为个人总结,如有不足之处,欢迎指出。谢谢!
相关文章推荐
- 数组与指针归纳总结
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- 指针常量与常量指针(const用法总结)
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- 指针常量与常量指针(const用法总结)
- Const用法总结(快速区分指针常量与常量指针)
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- 【总结归纳】指针数组和数组指针
- C++之常指针,指针常量,函数指针,const用法总结
- c语言的指针、数组和常量修饰符const
- 第十章 数组和指针(关键字const,指针分析数组属性)总结 140519
- Const用法总结(快速区分指针常量与常量指针)
- 指针常量与常量指针(const用法总结)
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- const限定修饰符用法总结(常量,指针,迭代器,函数参数,成员函数)
- const 指针的一些总结
- const常量、指向常量的指针和常量指针
- 数组与指针的艺术 第二章 数组名是一个指针常量吗?
- 字符串、字符数组、数组、指针关系总结
- 第二章 数组名是一个指针常量吗?