唠唠C++二级指针、二维数组、指针数组、数组指针等的区分

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Fudanqqqqq/article/details/102674525

今天看c++primer第六章,有这部分的内容,脑子有点糊涂了,看了几篇博客,自己敲了下,记录一下备忘。
二级指针:

int **p;

二维数组:

int p[10][10];
char q[10][10];

指针数组:

int *p[10];

数组指针:

int (*p)[10];

咋区分后面这俩呢,记住[]的优先级比*高,所以上面写法,p先和后面的[10]结合,也就是p首先是个10个元素的数组,那么前面的int *就是元素类型,也就是存了10个int指针的数组。
那么下面这个写法把 * p括起来,那首先p就是个指针,指向什么呢,还剩下前面的int和后面的[10],也就是这个指针指向10个int的数组。
归纳一下,先看变量名跟前后谁结合,结合之后就可以判断变量类型。然后把这部分拿走,看剩下的是什么。

然后另外一点,int * p1[10]这是个指针数组,int * * p2是个二级指针。p1[0]、p1[1]、p1[2]…等都代表不同数组的地址。数组首地址和指针相同,故p1和p2意义一样。* p1得到的是p1的第一个元素,是一个int指针。* p2得到的也是一个int指针,两者一致。
证明:下面代码可以运行无报错

int f(int **p)
{
	return 0;
}

int main()
{
	int* q[10];
	f(q);
}

但如果把q定义为二维数组、数组指针等等就都会报错。
二维数组为什么不行:例如int q[10][10];,q就不是个指针,q不能自增自减,这显然不能转化为二级指针。

数组指针为什么不行:例如int (*q) [10];,q确实是指针了,但q+1和q在内存距离差多少呢,是差10个int,而p和p+1差就差1个int(4个字节)。下图为证,故也不能替换。
这里q是指针数组,等同于二级指针,相邻内存差4,1个指针占4字节,也就是差距一个指针变量的距离。
在这里插入图片描述
下面q是数组指针,可以看见q和q+1内存差距28,十进制就是40,即10个int的空间。
在这里插入图片描述
所以数组指针和二级指针(指针数组)为什么不能混用的原因就很明显了,有疑问可以评论区交流,今天就先总结到这里。 2019年10月22日 00:31:48

猜你喜欢

转载自blog.csdn.net/Fudanqqqqq/article/details/102674525