对于c/c++的初学者来说指针是一个容易出错的地方,这并不是指针困难,而是我们在学习时没有理解到位。(事实上我也体会了好久,今晚突然有一点顿悟,遂做此文让大家少走弯路)
首先我要阐释一下c语言中的类型,所谓类型其实就是固定大小的一段空间。不同的类型有不同的大小,例如:int申请4字节空间,char申请一字节空间......
指针类型也是一种类型,没有什么区别,所以指针也是申请一段固定大小的空间罢了。与一般类型的区别在于指针申请的这一固定大小的空间中存放的内容是一段内存地址。所以不同的指针类型申请出来的空间是多少呢?答案是显然的,稍加思考我们就知道既然存放的是内存地址,那么指针申请出来存放内存地址的空间就应该正好能存下所有的内存地址,也就是可以给所有的内存空间编号。例如:如果你的电脑是32位的,那么指针申请的空间就是4字节的。如果你的电脑是64位的,那么指针申请的空间就是8字节的。
那么就又有一个问题,不同指针类型之间有什么区别?(注意,这一点是跟普通类型的区别所在,普通的int,char的区别是申请的空间不同。但是不同类型的指针申请的空间是相同的,所以他们的区别不在这)区别在于不同的指针类型指向的空间大小不同,注意是指向的空间大小不同。这一点对于初学者很难理解,初学者会认为指针指向的空间还有什么区别,不都一样吗?不不不,这就是最该时时刻刻带在脑中的概念,也是指针的精髓。不同的指针类型指向的空间是不同的,例如:int* 指向的空间是4字节的,char*的指针指向的空间是一字节的。这在解引用(*)时大有用处。你对int*的地址解引用得到的是地址后跟着的4字节的内容,你对char*的地址解引用得到的是地址后1字节的内容。
总结:指针它不应该是一个针,而是指向一个范围,指向一段空间。我们应该这样理解指针:指针的大小跟机器本身有关,指针的内容为指向类型那么大的一段空间的首地址。读起来好拗口,我举几个例子:
int*:指向类型是int为四字节,所以就是:该指针的内容为某四字节空间的首地址。
*(int*):对int*解引用,就是一个空间为四字节的类型。
int**:指向类型是int*为八字节(默认为64为机器),所以就是:该指针的内容为某八字节空间的首地址。
void**:指向类型是void*为八字节(默认为64为机器),所以就是:该指针的内容为某八字节空间的首地址。
*(int**):对int**解引用,就是一个空间为八字节的类型。
反正提到指针一定想到指向空间大小,该大小为去掉一个*后类型的大小。