关于C语言指针问题

这里我想问一下为什么a[0]是int *,int *是什么意思?p的类型是什么?
*在书本上是去内容运算符,“用*对它解引用”这要怎么理解?
求解,十分感激!
最新回答
干凈没朋友

2025-06-18 08:44:58

指针类型定义的时候,用的是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 **类型)
思檀郎

2025-06-18 09:07:27

*有4种用法
1,类型 *,结合在一起,表示指向某个类型变量的指针,例如int *ptr, void **data
2,乘法,这个不必说了
3,解除引用, 例如: int a = 0; int *ptr = &a; *ptr = 1;(效果等同于a = 1),这叫解除引用,即通过地址找到实际的对象来操作
4,/*,注释.
不要把解除引用和声明指针类型弄混了.
喵呜狸

2025-06-18 09:16:55

你可以把“解引用”理解为“取内容”。
对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**类型的,是错的。内存布局上二维数组顶多能算一级指针,不是二级指针。二维数组和二级指针在内存布局上完全不是一回事