c++ 指针 数组 数组指针以及const限定符

今天被指向字符串数组的指针怎么写给搞懵了,索性花点时间把一堆指针给梳理了一下。

从最简单的开始,指向变量和数组的指针。

注释里常指针代表指针本身是常量(网上有各种不同的说法所以我直接用了自己习惯的叫法)

	/***********单一指针***********/
	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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值