首先,需要知道的是:指针其实就是地址,而我们通常口头上说的指针其实是指针变量。这个指针变量保存的是地址。
然后指针类型有很多,抛开野指针之后另谈,我在这里将指针分为四大类;
一种是相对简单的一类指针:整形,字符型,浮点型等指针,指针的定义方式也很简单:
例如整形指针是int* ,*表示该变量是指针变量,int表示指向的类型,int* 就是表示指向整形的指针。字符指针等也类似,如图:(附地址图,可以辅助理解指针的指向)
第二类是数组类,数组也有指针,有数组指针,指针数组。名字类似,但是用法是不同的;数组指针就是指向一个数组的指针,而指针数组,则本质上是数组,是多个指针变量组成的数组。只是这些指针变量的内存空间是连续的(指针变量的内存空间连续,但不是其指向的连续,要区分清。先讨论数组指针:
数组指针,就是指向数组的指针。对于一个数组来说,数组名等于数组的首地址。但是如果对这个数组取地址,那么得到的虽然也是首地址,但本质上是一个数组的地址,接受这个地址就不能单纯的用一个int* 类型或者char* 类型指针接收,而是需要用到数组指针。数组指针的类型写法是(这里用整形数组演示),整形数组指针写法:int (* p)[10],表示p是一个指向元素个数是10,元素类型是int的数组的数组指针。int (*)[] 就是整形数组指针的标志,字符型,浮点等类似。如图:
接下来再讨论指针数组:指针数组比较容易理解,就是一个元素类型是指针的数组;他们在内存中的排放是连续的,如果有一个二级指针来指向指针数组首地址的话,就可以用来访问多个不连续的地址。下图为例:
接下来讨论第三类:函数指针,对于函数指针,这里只谈最普通的函数指针,至于函数指针数组以及其他,这里只说明函数指针数组定义方式:int (*parr1[10])();? ?其中int(* )()表示函数指针,parr[10]表示一个数组。所以为函数指针数组;
主要谈论函数指针:函数指针经常被应用于回调函数中。回调函数就是不是由写这个函数实现方使用,而是由函数,或者说另一方在某个特定条件下进行调用。也就是说,他可能不是由我们自身调用的,而是在另一个函数中被另一个函数调用。而实现方式就是,我们将一个函数(我们这里叫做函数1)的指针传给另一个函数(我们这里叫作函数2),当函数2在执行过程中,可能会用到这个函数,调用时,我们就称为函数回调。
qsort就是典型的函数调用的库函数。
下面为一个函数回调的例子:
第四类是二级指针,二级指针就是指针的指针,它保存的是指针变量的地址,用法同一级指针类似,只是定义有些不同。int* *p, 定义时要有两个*号,表示一个指针,指向的是int* 类型;