关于指针的总结

前几天学习完了指针,不愧是号称c语言最难的地方确实有点晕,所以今天赶紧来总结一下加深自己理解。

一:指针是什么

指针是一个变量,其存储的是另一个变量的内存地址。这是一个官方的描述,我看来内存就是一个楼房而指针指向的内容就是这个楼中的房间门牌号(即内存单元)。而需要注意的是每个指针变量也是要占用内存单元的。

二:有什么指针类型

int* 为整形指针变量-----用于存放整形的地址。

float*为浮点数指针变量-----用于存放浮点数的地址。

char*为字符指针变量-----用于存放字符的地址。

这是最基本的的几种指针类型。当然肯定有其他的指针类型,如:数组指针(ps:很容易与指针数组搞混)。函数指针等等。

三:指针的运算

指针的运算是第一个小难点。

首先,最常见的指针运算是指针间的相减。这种常见于数组中,我们可以通过数组中的两个元素的指针相减来快速的得到两个元素之间的元素个数。

其次,就是难点了,指针与常数的相加减。在指针的相加减时,指针对应的地址会移动相应的字节,而移动的字节是通过指针的类型决定的。如int*的指针+1会往后移动4个字节,而char*的指针+1会往后移动1个字节,这里移动字节的多少是与类型大小对应的。(注意指针变量的大小永远是4或8个字节(具体是由编译器决定的),而加减的大小是可以不一样的,这是一个难点,我当时是没有立刻搞清楚的)。

我觉得这是一个十分重要的 知识点,因为这个性质我们可以用强制类型转换来验证自己计算机上的数据是大端存储还是小端存储

而说到指针是离不开数组的,这两个简直就是绝配,一起出现来给学习的人重重一击。:(

四:数组名是什么

数组名就是数组首元素的地址,而&arr(假设arr是一个数组)是一个数组的地址。但是我们在编译器中进行打印时,发现这两个东西打印出的结果是一模一样的。

所以很多人可能认为两者并没有什么区别 ,但是其实两者差别很大,比如在两者后面都加一结果就会完全不一样,因为一个跳过的是一个int类型,而一个却跳过了整个数组。

五:指针数组 

这就是两者诞下的一个邪恶物种,刚学习时给我恶心的不的了。通过其名称可得这首先是一个数组的类型而这个数组的元素就是指针。其基本样子为int *arr[ ],当然前面的int可以改变这取决于数组中指针的类型。比较值得注意的时该数组的数组名是一个二级或多级指针。

六:数组指针

这个名称和上一个十分像,但是却十分不一样。因为这是一个指针而且这个指针存储的数组的地址,像之前说明的&arr就是一个数组的地址。数组指针的基本形式是int (*arr)[ ],同时其前面的int是由数组的类型决定的。而这个基本形式与上一个指针数组非常像就是差一个括号,这个括号十分重要因为其使arr先和*结合从而形成数组指针。

七:函数指针

啊啊啊真的有好多类型啊,打字手都累了:(

很多人可能并不知道函数还有指针,但是确实是有的,这个用的好像很少,我也不知道为什么会有这个东西,但我相信任何东西都有其存在的必要,也许只是我们的层次太低了。对于这个指针也是十分的特别。假如有一个函数为int sun(int x,int y),则其函数指针为int (*sum)(int int)。即其返回类型和参数类型要一一对应。

当然就是这样去进行设置。xdm,看我的代码有没有发现什么sum也可以直接进行地址的打印而且地址是一样的。这是很神奇的,如果这样我们可以发现很多东西。 

我们在使用函数指针时可以不去解应用 就可以使用,正是因为咱们刚刚发现的sum本身就是一个地址,所以才可以这么使用的。

兄弟们,你们可能现在觉得还可以,但是要知道指针是可以不段进行套娃的,所以先深刻理解这些基本的知识才是最重要的。当然我还有一些小练习也很有意思,下个文章我会讲解的。

各位如果有好的意见可以发给我,谢谢兄弟们。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值