指针类型定义的时候,用的是int *pt; 你可以直接理解成pt是用来存放一个地址的变量,而它代表的这个地址上存了一个int型数据。*pt就是去pt这个地址上取里面存放的内容,所以*pt是int类型,pt也就按照定义的格式说成是int *类型。“用*对它解引用”这句话的意思就是去指针代表的这个地址上取里面存放的内容。而pt[0],跟*pt是完全相同的意思,就是去取pt代表的地址上存放的int型数据。你问的内容里p跟上面我说的pt是一种类型,即int *类型。而a由于是二维数组,它相当于指向指针的指针,即你去a所指向的地址上取到的数据并不是int型,而是又一个地址类型,即*a是int *型,即a[0]是int *型。(a也就相当于int **类型)
*有4种用法1,类型 *,结合在一起,表示指向某个类型变量的指针,例如int *ptr, void **data2,乘法,这个不必说了3,解除引用, 例如: int a = 0; int *ptr = &a; *ptr = 1;(效果等同于a = 1),这叫解除引用,即通过地址找到实际的对象来操作4,/*,注释.不要把解除引用和声明指针类型弄混了.
你可以把“解引用”理解为“取内容”。对int*(指向一个int的指针)取内容,取到的是int对int (*)[3](指向一个长度为3的int数组的指针)取内容,取到的内容是int[3]关于“指向一个长度为3的int数组的指针”如果把数组和指针弄混了会不太好理解。你取一个int*的内容,比如 int *a; 不是用的 *a 吗,然后 a[0] 是从a开始的第0个int那么你取一个 int(*)[3] 的内容(内容是数组)的第0个int,是 (*a)[0],不是 a[0],a[0]是从a开始的第0个int元素数量为3的数组这样可以理解吗?a[0] 是 int* 是因为它是 int[3],然后实际使用中可以赋值给int*、大多数情况语法上也和int*一致p的类型是什么看原问题另外你采纳的那个答案中,说a是二维数组所以是int**类型的,是错的。内存布局上二维数组顶多能算一级指针,不是二级指针。二维数组和二级指针在内存布局上完全不是一回事