我平时不太看书。倒不是我没有读书的习惯。而是如今的社会知识传播的方式太多。书已经不是唯一知识的载体。至于“书是人类知识的阶梯”这句名言的时代已经过去了。每天各种微信公众号推介的文章已经够看了。特别是专业微信公众号内容特别丰富。所以我已经不看书好多年了。本文引用地址:http://www.eepw.com.cn/article/201607/294163.htm

最近事情比较少,我在单位的书架上发现了一本《C与指针》这本书,常年闲置已经落满灰尘。我翻看了两章后,由于这本书年代久远,纸张已经非常脆弱。所以我上网订购了一本崭新的。我以后的半个月我浏览这本书。只能是浏览470多页的书要读一遍还是非常困难的。 所以我打算做一点读书笔记。

以前我以为这是一本非常那与理解的书,所以一直没有去翻阅这本书。现在觉得我的认识确实有点问题。作者在给这本书命名还是非常讲究的---《C与指针》。既然是“与”,那么在作者就介绍了两个方面---C&指针。

在书的前5章介绍的是C语言的入门。因为C的基础知识比较少,所以作者只使用了不到100页的篇幅来介绍。包括“快速上手”、“基本概念”、“数据”、“语句”、“操作符和表达式”。虽然作者介绍的内容比较少,因为作者假设了读者已经对于语言有了基本了解。只是为了后面介绍指针做铺垫。但是足够入门学习了。因为作者的水平非常高,所以如果仔细品味定能事半功倍!

其余18个章节的内容,除第14章《预处理器》、15《输入/输出函数》、16章《标准函数库》与指针没有明显关系外,其余都是指针或者指针延伸。因为只是面比较扩散,梳理起来当然比较麻烦。因为作者认为指针知识一个单纯的概念,指阵常用的方法即是指针和解应用,即 point与*point,这个非常容易理解。但是这个原理对编程工作效率是没有多少提高的。因为这个强调了指针的值和解引用的值,即指针的地址和指针地址中值地址所存储的值。这句话话来源于我的一位同事,读起来比较绕口,但是图解非常简单。

int a = 102;

int *Point ;

Point = &a;

其实很多初学者认为指针比较难于理解,是因为可能对int a = 102;这句理解也不够全面。这也是C语言造成盲区----覆盖了硬件某些特点。如果是使用汇编编程,那么每个变量的地址必须自己安排,必须时刻记住了哪些地址已经被哪些变量使用。在C中编译器会替用户自动安排。这就节省用户很多精力,但是也会造成初学者不易理解。在这本书中作者介绍了“内存地址”、“值和类型”。虽然内容很简单,但是如果深刻理解,随后内容掌握将势如破竹。

其实int a = 102;这条语句完成了两件事情,首先在RAM区划分了两个字节的空间。这个地址编码可能是0x00 12。为什么说“可能”。因为每个变量都有生命期,在他诞生时候系统只能根据当前RAM的使用情况划分一个空间。这个地址只能当前空闲的某个地址。

其次在0x0012这个地址中内容更新为102.如果。如果只划分空间,那么空间的值将是不可预知的。应该为上次使用该空间时遗留的值。在这里我们就知道了a其实代表了一个地址,为了编写程序方便我们使用a来引用该地址空间和值。

a = 105;这条语句是更新了a地址空间的值,更新为105。即0x0012地址空间的值现在为105。这里其实引出了另外两个概念---左值和右值。在此可以更加明确此处这个概念。一般情况先左值提供地址,右值提供值。

我们可以通过作者提供简单例子来理解左值和右值。

int a = 102;

int b = 500;

a = b;

我们来分析以上三条语句。int a = 102; 划分地址0x0012,更新地址内容是102。

Int b = 500; 划分地址0x1005,更新地址内容是500。如下图:

a = b; 是非常简单的一条语句,这条语句执行的结果就是a地址空间的值更新为b地址空间的值,即500。其实可以按照两个步奏来理解这条语句,首先,取b地址(0x00 15)空间的值500,其次将500存入a地址(0x00 12)空间。

因为a、b都是变量,具有地址空间,a = b;是取b地址的值存入a地址。b提供值,a提供了空间。所以这也就明白了这个语句的正确读法应该是“将b的值赋给a”。这是省略的读法,扩充一下应该是“将b地址空间的值赋给a地址空间”。同理 b = a;也就非常好理解了。

a = 5;这条语句是“将5赋给a”,也就是将a地址空间的值更新为5。a提供地址,5作为立即数提供了值。5 = a;显然是一条错误的语句。因为a可以提供值,但是5是立即数提供不了地址。

所以在C中变量都代表了在其生命周期内一个固定的地址,在有了地址的概念,指针也就不难理解。

int a = 102;

int *Point ;

Point = &a;

该条语句也就完成两件事情,首先划定地址(0x0050)空间,在该地址空间插入a的地址(0x0012)。其次在地址0x0050内存入a变量的地址,值为0x0012。

所以Point也是一个地址----0x0050,其值为0x0012。0x0050这个地址我们可以不关心,就像我们使用a,我们从来不关心a的物理地址(0x0012)一样。

Point的值是0x0012,在这里0x0012也是一个普通的值,与100、200没有任何区别。所以这条语句也完全正确。

Point = a;或者Point = 100;

但是这做样做的意义何在,其实这种语句在实践中非常少见,而且还非常危险。

我们不妨来分析一下。

Point = a;是取a的值存入Point ,也就是取地址(0x00 12)中的值(102)存入Point(地址 0x0050)。

Point = 100;将立即数100存入Point(地址0x0050)。但是这两条语句意义如果在解引用中将非常危险。

Point = a;执行结束后,* Point 的值将是地址102处的值,* Point=22;将改变地址102中的值为22。地址102也许是其他变量的地址空间,这会造成整个系统的混乱。程序运行出现不可控的异常。

Point = 100;执行结束后,* Point 的值将是地址100处的值,* Point=22;将改变地址100中的值为22。同样也会使系统出现紊乱,出现不可控的异常。所以非常危险。

所以我们必须明白Point与*Point之间的关系。只要明白两者之间的关系,简单使用指针甚至排除指针造成问题也是可以的。

理解C语言极其指针必须要有计算机系统的概念,只要有计算机简单模型思想。见瓶水之冰,而知天下之寒,鱼鳖之藏也;尝一脔肉,而知一镬之味,一鼎之调。

c语言指针读书笔记,《C与指针》读书笔记一相关推荐

  1. 【C语言学习笔记】26. 指针(3)指向指针的指针、传递指针给函数

    前言 指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链.通常,一个指针包含一个变量的地址.当我们定义一个指向指针的指针时,第一个指针包含了第二个指针的地址,第二个指针指向包含实际值的位置. ...

  2. 《c语言从入门到精通》看书笔记——第10章 指针

    1.地址与指针 地址:就是内存区中对每个字节的编号 指针:可以看作是内存中的一个地址.在程序中定义了一个变量,在进行编译时就会给该变量在内存中分配一个地址,通过访问这个地址可以找到相应的变量,这个变量 ...

  3. C++_指针的定义使用_指针所占内存空间_空指针_野指针---C++语言工作笔记023

    然后我们再来学这个指针,指针是c系列语言中的,重要的部分,在其他的语言里没有, 所以也难一点. 可以看到通过 int * p; 定义一个指针,指针就是指向一个地址. 然后有个 int a =10; 可 ...

  4. C语言学习笔记----4(指针)

    文章目录 指针深入介绍 指针类型 二级指针 字符指针 指针数组 数组指针 函数指针 函数指针数组 函数指针数组指针 回调函数 总结 指针深入介绍 众所周知,亚里士多德1撑起了古希腊科学.哲学的半壁江山 ...

  5. C语言学习笔记---数组和指针的区别

      在平时使用数组和指针的时候,感觉他们的使用很类似.那么数字和指针在使用的过程中到底有什么区别呢?   下面通过一个例子来简单分析一下. char str1[] = "abcdef&quo ...

  6. 【鹏哥C语言网课笔记】初识指针

    目录 一.指针是什么? 二.指针和指针类型 三.野指针 指针未初始化 指针越界 指针指向的空间释放 如何规避野指针 四.指针运算 指针+-整数 指针-指针 指针的关系运算 五.指针和数组 六.二级指针 ...

  7. 【C语言学习笔记】函数指针的定义和用法

    函数指针的定义和用法 先回顾下数组的储存方式,当你在程序中定义了一个数组,那么系统就会自动根据你的数组类型和数组长度申请一块储存空间给你.而且数组名储存的地址刚好就是申请的这块储存空间的首地址,这也是 ...

  8. C语言复习篇之数组与指针

    C语言复习篇之数组与指针 学习了一段时间的嵌入式linux了,学习中有很多的东西需要总结,有经验有教训,我觉得把他写下来会更好,就当做是一种笔记的形式,记录学习中的点点滴滴,不仅仅自己可以经常复习,也 ...

  9. c语言 数组指针,C语言数组名及指向数组指针的小结

    相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址. 现在有这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地 ...

  10. c语言中变量加1,c语言中,指针加1的情况.指针变量详细介绍

    指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容: 指针的类型, 指针所指向的 类型, 指针的值或者叫指针所指向的内存区, 还有指针本身所占 ...

最新文章

  1. 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
  2. mysql开启function,Mysql自定義函數(function)
  3. Python基础1 历史 变量
  4. IOS开发之----常用函数和常数--秀清
  5. FusionChart完全入门手册 -2
  6. android进程间通信:使用AIDL
  7. 那些年,冒死拍过的老师逗逼搞笑照片 !
  8. python3转码python2_python2写的代码移植到python3后无法转码成中文文本,请大神指教,谢谢~...
  9. leetcode之53.最大子序和
  10. 计算机课程联合考试是什么意思,计算机技术在职研究生能否通过一月联考的方式学习课程内容...
  11. PAT 乙级 Java 合集
  12. 我为什么关注范冰冰和苍井空
  13. 桃李春风一杯酒,江湖夜雨十年灯。—第三十五天
  14. mysql 竖列变成横行_mysql 横变竖 竖变横
  15. laravel跨域问题
  16. js 数组转json,json转数组
  17. python 条形图填充疏密_可视化库-Matplotlib-条形图(第四天)
  18. 达观数据:文本大数据的机器学习自动分类方法
  19. IDEA settings.xml 阿里云配置备份
  20. 索尼sr621sw和索尼sr626sw规格一样吗

热门文章

  1. maximum-subarray[最大连续子序列]
  2. JSON数据结构(A、快速入门篇)(Yanlz+Data+JsonArray+JsonObject+JsonValue+JsonMapper.ToJson+JsonMapper.ToObject+)
  3. python3 爬虫 爬取华为应用市场 APP应用评论(一)爬取全部评论——学霸君
  4. 分享下最近的Nvidia GPU 3060 laptop GPU、linzhi、Tesla算力曲线
  5. matlab中contour 函数的用法(绘制等高线)
  6. Postgresql学习笔记之——SQL 执行计划
  7. 录音转文字电脑软件有哪些?录音如何转文字?
  8. yarn create @umijs/umi-app或者yarn create umi myapp 报错:文件名、目录名或卷标语法不正确。
  9. HDUOJ 1847 Good Luck in CET-4 Everybody!
  10. php opcode 启用,Drupal8安装提示PHP OPCODE CACHING未启用的解决方法