指针之所以比普通变量复杂,主要在于它多了一个指向,或者说指针所包含的内容是“买一送一”的,明处的“一”是指针本身这个变量,而暗地里隐含的“一”是指针所指向的内存。如果忽略了后者,一些似是而非的说法就会让指针的概念模糊不清。
变量都有类型,于是很多人也会问:“这个指针是什么类型?”,这个问题看似普通,大家也都习以为常,但它相当于在问“刘先生,您贵姓?”。指针变量的类型就是指针型,如同int就是整型一样,只是指针变量通过所保存的地址值指向另一段关联内存,而通常所说的指针类型实际是指这块关联内存的类型。
所以完整正确的说法应该是“这个指针指向的内存定义为什么类型?”,比如该指针“指向的内存为整型”“指向的内存为浮点型”“指向的内存解析为某函数”等,这样表述太冗长,于是就有了现在“整型指针”“浮点型指针”“函数指针”等简化说法。不过这种简化对于初学者可能造成严重误导:它掩盖了指针中隐含的那段被指向的内存。比如,“整形指针” int *pA;这个定义实际包含两层含义:
1) 定义了一个名为pA的变量,是指针型。
2) 这个指针变量指向的内存单元类型为整型。
把“指针指向的内存的类型”简(误)称为“指针类型”,是导致C指针难以理解的一个重要原因,因为这种说法掩盖和混淆了指针与其指向内存的双生关系。
再次强调,所有指针变量保存的都是一个地址值,指向另外一段内存,而我们关心的是这段“被指向”内存的类型。还绕不清楚?看看英文的表达:”The type of a pointer actually means the type of the memory unit which is pointed by this pointer”