指针是常量,指针的值不能改变,但是指针指向的值可以改变。
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
指向常量的指针:指针的值可以改变,但是指针指向的值不能改变。
char data = 'a';
char buf = 'b';
const char* p = &data;
p = &buf;
//*p = 'A'; //error:assignment of read-only location‘*p’
数组中的每个元素是const,不能改变
const char array[5] = {'0', '1', '2', '3', '\0'};
//array[3] = 'a'; //error:assignment of read-only location ‘array[3]’
同3.1 数组中的每个元素是const,不能改变
char const array[5] = {'0', '1', '2', '3', '\0'};
//array[3] = 'a'; //error:assignment of read-only location ‘array[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 表现一致。带着这样的观点,我们来看下下面的介绍。
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*类型的,即指向常量的指针!
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,即每个元素是指针常量:指针的值不能改变,但是指向的值可以改变!
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节的内容。
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
原文链接:https://blog.csdn.net/slx_391987/article/details/39008539