今天被指向字符串数组的指针怎么写给搞懵了,索性花点时间把一堆指针给梳理了一下。
从最简单的开始,指向变量和数组的指针。
注释里常指针代表指针本身是常量(网上有各种不同的说法所以我直接用了自己习惯的叫法)
/***********单一指针***********/
int a = 1;
int b = 2;
const int c = 3;
int *p1 = &a;//指向变量的变指针,指针可以修改值,也可以修改指针指向的值
//*p1 = 2; valid
//p1 = &b; valid
//p1 = &c; invalid 不能把常量地址赋给指向变量的指针
const int *p2 = &a;//指向常量的变指针,指针可以修改值,但不可以修改指针指向的值
//*p2 = 3; invalid
//p2 = &b; valid 可以将变量的地址赋给指向常量的指针
//p2 = &c; valid
int d[5];
int * const p3 = d;//指向变量的常指针,指针本身不可以被修改,但可以修改指针指向的值(数组名等同于这个写法)
//int * const p3 = &c; invalid 类型不匹配,p3指向变量而c是常量
//int * const p3 = &a; valid 可以将变量的地址用于指向变量的常指针初始化,但是初始化后指针不可被修改
//*p3 = 6; valid; 指针指向变量,因此可以用指针修改变量的值
//p3 = &a; invalid 指针不可被修改
const int * const p4 = &c;//指向常量的常指针,指针不可以被修改,指针指向的值也不可以被修改
接着是指向指针的指针。
/************指向指针的指针***********/
int **p5 = &p1;//指向int *类型的变指针
//int *s = p1; p5 = &s; valid
//*p5 = &a; valid
//**p5 = a; valid
//由于没有限定符,p5自身能被修改,指向的指针也可以被修改,指向的指针指向的值也可以被修改
int * const *p6 = &p3;//指向int *const类型的变指针
//int * const s = p3; p6 = &s; valid
//int * const s = p3; *p6 = s; invalid
//int s = 5; **p6 = s; valid
//p6自身能被修改,p6的限定符在第一个*和第二个*之间,这个限定符限定的是它右边的*p6,因此*p6是常量不可被修改,而**p6是变量可以被修改
int ** const p7 = &p1;//指向 int *类型的常指针
//int *s = p1; p7 = &s; invalid
//int *s = p1; *p7 = s; valid
//int s = 5;**p7 = s; valid
//const限定符限定的是p7,因此p7不能被修改,而*p7和**p7可以被修改
const int **p8 = &p2;//指向 const int *类型的变指针
int const **p9 = &p2;//等同上
//const限定的是**,因此p9和*p9可以被修改,而**p9不可以
const int * const * const p10 = &p1;
//完全限定,没有任何值可以被修改
总结1:
通过对指向指针的指针的研究发现。const限定符限定它右边的目标。而且不会穿过一层解除引用符号。比如const **p就是指**p为常量,但是*p和p是变量,不受const限制。如果要限定为常量,则需要写成const *const *p和const **const p。
最后是指针数组
/**********指针数组***********/
int *p11[2]{ p1,p3 };//变指针数组,数组不能容纳常指针
int **const p12 = p11;//等同变指针数组名
const int *p13[4]{ p1,p2,p3,p4 };//常指针数组,数组既可以容纳常指针也可以容纳变指针
const int **const p14 = p13;//等同常指针数组名
总结2:
结合总结1的结论以及指针数组的研究,可以看出数组名可以和*const互换。
最终总结:指针的读和写:
1、读任意一个指针,从指针名开始从右往左读。遇到const限定符则说明当前指针为常指针,遇到解除引用符‘*’则往上指一层。
2、const 和 变量类型之间没有"*"的时候可以交换顺序。
以任意指针为例:const int ** const * p。这个指针p是变指针,而*p被const限定因此不能被修改。**p是变指针,将const 和int交换,看出const限定了***p,因此***p是常量不能被修改。
3、*const 可以被视为[]放在后面
例如int *const *const p,可以被视为p[][],也就是说p是int类型的二维数组的数组名。
4、写一个变量或者指针的指针,只需要在这个变量或指针的类型后面加*,如果要限定这个指针为常量,则加*const