**p[ ] 和 *(*p)[ ] 的区别

有关指针部分的疑惑,浏览到他人很有帮助的解答,引用一下并捎带自己的理解码一下。

如果是表达式,那么方括号里应该有个数字,或变量,否则你没东西算。

那么就应该是声明了,你缺少了基类型。

一看就知道你是初学者,把指针声明里的星号,和普通算式里的间接访问运算搞混了。

假设你的基类型是整数,用int,那么int *p;这句话里int的意思,就是你指针里存的那个地址所对应的那个空间,是用来存整数的,不能存小数或字母等。

这个表达式是这么看的:int * p;

不要这么看:int *p;

int叫做基类型,int *叫做指向int型数据的指针类型——p里存的是个指针,也就是地址。

那么int **,就是以int *为基类型的指针类型。它是指向指针的指针——它作为一个地址,所连接的存储空间里,存的是指向int数据的地址。

所以int ** p[ ];就是告诉计算机:给我一连串的空间,每个空间都是装地址的,而且这些地址是指向地址的,别给我搞成指向其他类型的了……

那么int * (*p)[ ];想懂这句声明,你要先明白一个概念:数组的名字,是一个指针。也就是说,数组的名字,他天然就装着这个数组的地址(也就是它第一个元素的地址)。

比如int a[ ];int * p;这两句话写出来了——那么,我可以直接用p=a;把a的值给p。

所以int * (*p)[ ];这句话里 ,(*p)相当于一个数组名,也就是地址,而这里的 *p,不是取p指向的值!而是在说:p是个指针!!!这个指针指向的指针,是这个数组的第一个元素的地址(也就是这个数组的指针)。

——再连上前面的int *——是说:有一连串的空间,每个空间里都装的都是地址,这些地址指向的是int型数据。而p,是指针,它指向另一个指针,这个指针没有名字,但是这个没名字的指针,是指向这个数组的——也就是与这个数组里的第一个元素的地址相等。

我知道你不懂,那就再举个简单的例子。

int a[ ];int (*p)[ ];这两句话出来了,我能不能用p=a;来给p赋a值?显然不能,因为a是个地址,p是个指向地址的地址,所以应该是p=&a;来把a的地址赋给p。

或者直接写成int (*p)[ ]=&a;——这句话很有迷惑性啊!!一不留神你就把等号左边当成个算式开始取值了——千万时刻注意!当一个数据类型和星号共同出现时,它们的目的只有一个:告诉计算机这是指针。至于是指向啥的指针,你自己仔细。

综上,对于这个问题自己的理解是:

int ** p[ ]:
p为指针数组,即数组每个元素都为指针,这些指针必须指向指针,而非指向数据。
int *(*p)[ ]:
p为指针这个指针指向没有名字的指针数组的指针,而数组内的元素指向int型数据。

更直观点:

Type **[ ] 是一个数组类型,bound未知,里面放的是Type**
Type *(*)[ ] 是一个指针类型,指向一个bound未知的数组,该数组里放的是Type*

我知道说了这么多,可能你一个字都没看懂。

但没关系,这些都是纯玩儿概念的,没什么实用价值,属于“贵族的娱乐”~

作者:Garvey
链接:https://www.zhihu.com/question/65873675/answer/237381360

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值