重新认识C语言指针(上)

  
  

?独创性并不是首次观察某种新事物,而是把旧的,很早就是已知的,或者是人人都视而不见的事物当新事物观察,这才证明是有真正的独创头脑-尼采

     

& lt; p align=癱enter"在本文已经收录至我的GitHub,欢迎大家踊跃星和问题。你们;/p>
& lt; h4对齐=癱enter"祝辞& lt; https://www.yisu.com/zixun/a href=" https://github.com/midou-tech/articles " target="平等"> https://github.com/midou-tech/articles
& lt; h5风格=把丈?红色;text-align: center"在点关注,不迷路! ! ! & lt;/h5>

  

序言

  

 指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎。辨别一个人C语言学的好赖就看他对指针的理解怎么样。指针内容也是工作面试经常问到的问题。本文将带你重新认识那个绊倒你的指针,以解大家的心头之惑(恨)。

  
为什么要学习指针?
  

 有同学就要说了,既然指针这么难,这么不通俗易懂,为什么要学习他呢?其他高级语言都是把这块基本屏蔽掉了,不在让程序员直接操作指针,这里不直接操作指的是不让程序员用指针进行运算和强转而不是彻底没有了。举个java的例子

  
 <代码类="语言java ">对象obj=新对象();
  对象秒=obj;
  秒=新对象(); 
  

 如果你去仔细研究他们的行为,就会发现obj, sec都只是一个指向对象的东西,可以为空,也可以修改指向,所以它们其实都是指针,只是Java的教材里面不在去提这东西而已,具体原因看我后面讲解便知道了。

  

?继续说为什么学习指针,为什么学习指针就必须要说到指针的优点了。

  
      <李>指针可以直接操作变量地址,所以很灵活。   <李>指针操作会减少很多变量的拷贝使得程序性能提升。   <李>可以动态分配内存。   
  

 这些优点使得很多后台性能要求很高的系统,游戏内核,一些高并发的中间件都是使用C& c++语言开发出来的。比如强大的linux系统,nginx, mysql,复述等等。

  

 曾经看到一个搞笑的评论,终极战士

  
  

道生一,一生二,二生三,三生万物

  

电脑生汇编,汇编生C, C生c++, C/c++生万物

     

指针是什么?

  

 其实指针看起来复杂,听起来复杂,学起来复杂,但是总结下来指针到底是个啥,也就一句话。

  

& lt; p祝辞& lt; h5风格=把丈?红色;text-align: center"在指针就是地址,指针变量就是一个存放内存地址的变量& lt;/h5> & lt;/p>

  https://www.yisu.com/zixun/

& lt; img src=" https://i01piccdn.sogoucdn.com/db3bc129d2c88816 "祝辞& lt;/img>

  

 你没看看错,是的就是这么简单明了。通常我们说的指针就约等于说的是指针变量。

  

指针和内存地址的关系

  

 很多人不明白指针其实也就是不明白内存地址,所以要想明白指针必须先明白指针和内存之间的关系。在讲内存和指针之间的关系之前先说下什么是内存。

  

 先明白一个问题,什么是内存?编程人员常说的内存指的是什么?

  
  

?内存是电脑的一个硬件组成部分。从单片机的组成我们可以看的到,CPU、内存和输入输出接口,就组成一个完整的电脑,其他统统属于外设。内存是可以被CPU通过总线进行操作的,也就是与CPU之间有总线相连接的。电脑所有的输入输出,都是要从内存来实现的。内存包括只读内存ROM和读写内存内存,但在个人电脑(PC)中,我们通常所说的内存,是指读写内存。

  

?程序人员常说的内存其实是虚拟内存,程序直接操作的是虚拟内存而不是真正的物理内存。

     

纳尼重新认识C语言指针(上)程序都是操作的虚拟内存?那虚拟内存是个啥东西?

  

 这里先给大家画张C语言程序的内存布局图。<强>关于进程和内存管理会在后面的文章讲出来,记得微信搜索龙跃十二点关注。

  

重新认识C语言指针(上)

  

 这个图很好的描述了内存地址的布局,指针变量里面存放的地址也就是这个内存地址。顺便说下啥是内存地址,用十六进制表示出来的一串数字编号(就好比你家的门牌号),只是这个数字是给内存标号的32位系统下这个编号是4字节(32个)表示的,64位系统下是8字节(64位)表示的。(这个小问题面试会被问到的)

重新认识C语言指针(上)