关于指针,我对初学C语言的同窗们真的有话要说!

这些日子其实也不是闲着的,觉得自己算法方面差的很多,所以一个劲的看“严书”。不过真的是有爬雪山、过草地的感觉,万里长征还刚刚开始,我已经快到40岁了,也就是黄土都埋到一半的人了,不由得也要感叹一下了!又觉得操作系统还只是开了头,具体的理论知识,真的不懂多少,所以又要拿起那本“minx操作系统与实现”书来啃一下,至于是什么效果了,自己就没有办法了,看了后边忘前边,回过来翻前面的吧,后面的又不知看过没有了,总之是二师兄照镜子里外不是个东西了。好在了学也是没有白学了,终究是对C语言中的某些东西有了一点点感觉,因此上也在这里显摆显摆吧!

毋庸置疑,C语言中挺重要的东西就是那个叫做指针的东西,很多大部头的C书也是把指针作为一个重点和难点的问题来长篇累牍的说个不停,一些新入门的同窗们更是被指针弄得焦头乱额。这也就是凡是在网上学习C的都不禁要在这个博客那个论坛上,多问上几句C指针问题的原因吧,而且回答的人也真的很多,看来弄懂了这个以后,他们也都像我一样急于发泄一下郁积在对此问题的不满,特别想让新同窗快懂和少走弯路,可是呢事与愿违,偏偏这个问题却又是心急吃不了热豆腐的事,似乎没有几个人能用几天就大彻大悟,反正我是这么认为的。

好了闲话少言,还是说点淡的吧。

那么这个指针又是个什么东西呢?定义我这里就不班门弄斧了,书上比我说的好多了。我这里倒是有一个问题,就是指针就是地址吗?

是啊,指针跟地址究竟有什么关系呢? 那么我们要首先从地址开始说起了,但是地址这个东西如果要是说的话,是要从汇编语言的角度来说的,也就是讲微机原理 或 汇编语言的书一定会讲到地址这个话题。没有办法我们也不得不说了。

第一个问题物理地址,那32位的intel机器来说,2的32次方是4G,那么物理地址就是0----4G-1(因为从0开始,最大直到4G-1)了,因此我们如果能够直接操作物理地址的话,我们也就是在0----4G的范围内来访问地址了,那么有一个问题就是哪里是0地址,哪里又是4G地址呢,这个就很简单了,我们编号就好了,从0地址开始编号一直编到4G,这个不就跟没有说是一样的吗,想当然这样说的人,就会是想当然的,看似明白实际上对一个顺序的问题,是不是会有些糊涂呀。之所以这样问,就是因为,0后面是1,1后面2,2后面才是3,依次类推。形成了物理地址一个顺序上的编制序列,倘若1后面编号为8,这个可就没有规律可循了,也会出现意向不到的问题。同时也说明一个问题,物理地址没有负数。

第二个问题逻辑地址,逻辑地址就不一样了,假设我们把物理地址4G - 1作为逻辑地址开头0处,那么后面没有可用地址了,因此上前面的都是负地址,同样,若从某处开始的话,就在某处是0,而前面的是负地址,后面的是正地址,这时候我们要向访问前面的地址就的做减法,后面的就做加法。

第三个问题虚拟地址,而偏偏操作系统又必须通过某种地址转换的方式为我们的应用程序提供虚拟地址,它也是从0开始,没有负数,具体系统的怎么转换的那可说不好了,光Intel就有段管理和页管理等模式。不过它给应用程序提供了方便,就是我们不用管是怎么转换的,只要使用就行了,当然前提是操作系统分配了这个地址。

说完了这些似乎是明白了一些,糊涂了一大堆吧,这也就难怪了,如果是真的弄懂指针,还是要理解一下地址了。

可是我们连一句汇编语言也没有说呀,是不跑题了,当然 不是,在汇编语言中一个重点和难点就是叫做寻址方式的东西,恰好和我们指针的问题对应上,什么立即寻址,直接寻址,寄存器寻址,基址寻址,变址寻址,带比例因子的寻址都是这个范畴的问题,但是C语言的指针内部与这些是怎么对应上的,我们就只有研读编译原理中的问题了,我们没有能力学习那许多的东西也就是泛泛而言了。

还有一个令你意向不到的大问题一定会出现,就是每个物理地址和虚拟地址的有多大,也就是虚拟地址的单位是什么,对了1字节,注意是1字节,这个到了指针中,就是大大的问题。

说道现在其实可以回答一个关键的问题了,指针到底是不是地址,我想你也一定知道了吧。

当数据的类型是char时,指针和地址确实是等价的,一一对应的,但如果是int或其他类型呢,因为每种类型都描述为不同的长度,所以有些地址,在int型中永远也不可能被访问到,它仅仅是4的倍数的地址。

说这个的目的是,指针和地址真的不可分,但是不同的是指针的增减,不是地址简单的加一或减一的操作,而是要乘以一个比例因子。

发布了159 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_39410618/article/details/101560522
今日推荐