楼上的回答是在不敢苟同
*p[4]、(*p)[4]、**p的区别(由于里面牵扯一些东西比较深,我简单的讲讲吧)
*p[4]是指针数组,他是数组。数组里面放的是指针,简单的说定义了4个指针,分别是*p[0] *p[1] *p[2] *p[3],相当于将这四个指针打包到这个数组中
(*p)[4]是数组指针,他是指针并且是一个指向二维数组的指针。因为以行为单位,又称行指针。
通俗点讲,后面的[4]说明他的每行有4个元素,[0]代表第一列的下标,[1]代表第二列的下标,一次类推。(*p)的意思是指针p指向第一行,*(p+1)即指向第二行,同理一次类推。那么*(p+2)[3]的意思即是指二维数组第二行第四列的元素
**p是二级指针,即指向指针的指针,他也是一个指针,主要区别在于应用的范围不同,行指针作用对象仅仅是二维数组,二级指针的应用范围就广了,比较典型的就是他可以用指针参数传递内存,指针数组和数组指针可没有这样的用法。也可以用他动态申请内存,存储二维数组元素等等
楼主耐心学习吧,只要坚持下去,这些东西都会慢慢理解的
int (*p)[4] 这个是指针数组。里面存的是 4个int指针。数组名字叫p 。这里主要注意一下下优先级
()[]的优先级相同。结合方向是从左到右。所以先跟() 结合。int *p[4] 如果是这样就是 数组指针了。
int **p 是个二维指针。其实很好理解,打个比方。比如你的数据存在地址 2000 号中。你要从从2003号内存里找2000号内存。二维指针就是这样的。从2003 存的地址找到2002 再从2002存的地址找到2000。就是多了个弯而已。
int (*p)[4] 中p是数组指针,指向一个int 的二维数组,第二维长度是4
int **p 中p可以指向任意长度的一个int二维数组,第二维长度不一定要是4
int *p[4] 是指针数组,p是一个数组,他的成员是int指针。
int (*p)[4] 是指向一个p[4] 的数组
int **p 等价于int *p[4]