int p[3]; //首先从 P 处开始,先与[]结合,因为其优先级
//比
高,所以 P 是一个数组,然后再与*结合,说明
//数组里的元素是指针类型,然后再与 int 结合,
//说明指针所指向的内容的类型是整型的,所以
//P 是一个由返回整型数据的指针所组成的数组

指针的类型 和 指针所指向的类型 是两个不同的概念。

总之*p 的结果是 p 所指向的东西,这个东西有这些特点: 它的类型是 p 指向的类型, 它所占用的地址是 p所指向的地址。

声明了一个数组 TYPE array[n], 则数组名称 array 就有了两重含义:
第一, 它代表整个数组, 它的类型是 TYPE[n]; 第二 , 它是一个常量
指针, 该指针的类型是 TYPE*, 该指针指向的类型是 TYPE, 也就是数组
单元的类型, 该指针指向的内存区就是数组第 0 号单元, 该指针自己占
有单独的内存区, 注意它和数组第 0 号单元占据的内存区是不同的。 该
指针的值是不能修改的, 即类似 array++的表达式是错误的。

在表达式 sizeof(array)中, 数组名 array 代表数组本身, 故这时
sizeof 函数测出的是整个数组的大小。
在表达式*array 中, array 扮演的是指针, 因此这个表达式的结果就是
数组第 0 号单元的值。 sizeof(*array)测出的是数组单元的大小。
表达式 array+n(其中 n=0, 1, 2, .....) 中, array 扮演的是指
针, 故 array+n 的结果是一个指针, 它的类型是 TYPE *, 它指向的类
型是 TYPE, 它指向数组第 n 号单元。 故 sizeof(array+n)测出的是指针
类型的大小。 在 32 位程序中结果是 4。

6.在 指 针 的 强 制 类 型 转 换: :E ptr1=(TYPE 2 *)ptr2 中, , 如果 果 sizeof(ptr2
的 类 型) ) 大于 于 1 sizeof(ptr1 的 类 型) ), , 那 么 在 使 用 指针 针 1 ptr1 来 访 问 ptr2
所 指 向 的 存 储 区 时 是 安 全 的 。 如果 果 2 sizeof(ptr2 的 类 型) ) 小 于
1 sizeof(ptr1 的 类 型) ) , 那 么 在 使 用 指针 针 1 ptr1 来 访问 问 2 ptr2 所 指 向 的 存
储 区 时 是 不 安 全 的 。