实际上对于指针,总有人说听不太懂。但对于我来说,我更喜欢从数据类型的角度理解指针。而在汇总文章的时候,我发现自己写的指针篇幅真的不少,汇总难度有点大,我会尽力不太啰嗦。(而实际上,被汇总的文章虽然讲得详细,但是可阅读性很差,这点我自己承认,毕竟当初写博客只是为了梳理学习思路而已)注:不会解释结论是为什么,个别会演示结论效果,详细的结论效果都在被汇总的文章内。
目录
1·指针的简单理解
注:这段话是我自己学习指针的理解。
其实指针(变量)是一种数据类型,和int、long、char之类的是一样的作用,用来给数据分类储存的。只不过int、long等是用来储存整型数据,folat、double用来储存浮点数据,而指针是用来储存地址数据的。(所以,存放在指针中的值都被当成地址处理。)
而实际上地址又是什么?我们总说地址是编号(且是十六进制形式的编号,例如:0x00000000),那既然是数字编号应该是int类型的整型数据,为什么地址还要分出来指针类型来储存?
所以我把地址理解为,向内存申请住宿空间时候的证书(或者说是钥匙)。而这个证书上写着自己想要的证书编号(就是起始房间门牌号,也就是起始地址)、房间大小以及房间住客的类型。
地址理解:
例如:以数组指针为例子(存放数组地址的指针)
int arr[5] = {0,1,2,3,4}; //arr类型int[5]
int(*p)[5]=&arr; //p类型和&arr类型:int[5]*
arr整个数组 申请住宿空间的过程:
证书编号(也就是地址编号):0x88888888为起始地址,起始地址是证书编号
房间大小(也就是数据类型大小):int[5],20个byte大小(会占用20个门牌号)
房间住客(也就是数据内容):0,1,2,3,4。每个住客占用4byte大小的房间(也就是4个门牌号),实际上数组中的每一个住客也会有自己的证书,这里不过多介绍,只提示是int*类型的证书(也就是地址)。
申请完之后,就形成了地址,地址类型(钥匙类型)是int[5]*。
而指针在保存地址的时候,保存的也正是地址(证书)的信息。所以你会看到【一个int[5]类型的整个数组地址】在【使用指针进行地址保存的时候】需要用int[5]*类型的指针变量来对应保存。(p指针保存的是arr地址的证书编号,也就是arr数组的起始地址)
此时的指针变量p和&arr数据类型相同,*p和arr数据类型相同。
指针的大小问题:
指针保存的是地址,32位系统中的地址编号是8位16进制数字,正好在内存中占用4byte,所以32位系统中指针是4byte大小。所以指针的大小取决于地址编号。(32位系统中指针是4byte,64位系统中指针是8byte)
二级指针问题:
接续上面那段代码的解释。前面说到过,数组中的每个住客也会有自己的证书,那该如何保存住客的地址呢?如下演示。
例如:以数组指针为例子(存放数组地址的指针)
int arr[5] = {0,1,2,3,4}; //arr类型int[5]
int(*p)[5]=&arr; //p类型和&arr类型:int[5]*
int* pa = &arr[0]; //pa类型和&arr[0]:int*
(注:&arr[0]=arr; 数组名是首元素的地址,在运用的时候类型是int*)