指针数组:本身是一个数组,存放的元素类型是指针,例如int*p[10],是一个存放十个int*类型的数据。
数组指针:本身是一个指针,指向的是一个数组,例如int(*p)[10],指向的是一个存放十个int类型的元素的数组。
通常,数组指针常作为一维数组的形参,通过下标得到相应的数组内容。指针数组常作为二维数组的形参,通过两次解引用得到对于的数组内容。
函数指针:本身是一个指针,指向一个函数,例如int(*p)(int,int),形参是两个int类型,返回类型是int类型。
通过函数指针来调用函数的时候,可以不对函数指针解引用,这是因为函数名本身就代表函数的地址,因此函数名与函数名取地址后的内容相同。
当通过typedef来自主创建一个类型名时,对于数组指针,应写成:
typedef int(*ptr)[10];
而不是 typedef int(*)[10] ptr;
同理,对于函数指针,应写成:
typedef int(*ptr)(int,int);
而不是 typedef int(*)(int,int)ptr;
即新创建类型名应当紧靠*。